2011-09-01 44 views
11

trong RH Linux, mọi pthread được ánh xạ tới một pid, có thể được theo dõi trong các công cụ như htop. nhưng làm thế nào tôi có thể nhận được pid của một sợi? getpid() chỉ trả lại pid của luồng chính.Cách lấy pid từ pthread

+0

[Linux 2.6 thay thế LinuxThreads bằng NPTL] (http://drdobbs.com/open-source/184406204), Linux hiện theo POSIX và trả về chính xác cùng một PID cho mỗi chuỗi. –

+2

Bạn nên xem xét "chấp nhận" các câu trả lời mà bạn thấy hữu ích. –

+0

Steve-o: Có lẽ như vậy, nhưng linux vẫn tạo ra một quy trình riêng biệt cho mỗi luồng (mỗi luồng có được/proc/, trong đó khác với luồng/quy trình chính) – Rahly

Trả lời

10

pthread_self();

có thể được gọi trở lại ID của tiểu trình đang gọi.

Ngoài ra PID là quá trình Id, Một chủ đề có chuỗi Id không phải là PID. Tất cả các luồng chạy trong cùng một tiến trình sẽ có cùng một PID.

+13

Als downvote là bởi vì những gì bạn đang nói là sai. Các luồng Linux thực tế có thể được biểu diễn bằng một pid, vì chúng là các quá trình nhẹ. Trong thực tế, hàm sau tồn tại trong Linux unistd.h: pid_t gettid (void).Windows, mặt khác, có các Id luồng độc lập thực sự. – ThreeBit

2

PID là ID tiến trình chứ không phải ID luồng. Các luồng chạy trên cùng một tiến trình rõ ràng sẽ được kết hợp với cùng một PID.

Vì pthreads cố gắng di động, bạn không thể lấy ID của chuỗi hệ điều hành cơ bản trực tiếp. Thậm chí có thể không có chuỗi hệ điều hành cơ bản.

+0

Hay đúng hơn, vì luồng NPTL không còn nữa đã đăng ký dưới dạng quy trình. –

0

Tôi nghĩ rằng các chức năng bạn đang tìm kiếm là pthread_self

0

Chủ đề có tids (threadIds), và tất cả các chủ đề chạy trong quá trình tương tự (pid). Vì vậy, các chủ đề của bạn nên tất cả đều có cùng một pid giả định rằng chúng được tạo ra trong cùng một quá trình, bu họ sẽ có các tids khác nhau.

pthread_self() cho tid và getpid() nhận được pid.

22

Có hai giá trị chuỗi bị nhầm lẫn. pthread_self() sẽ trả lại id chủ đề POSIX; gettid() sẽ trả về id chuỗi hệ điều hành. Sau này là Linux cụ thể và không được bảo đảm để được di động nhưng có lẽ những gì bạn đang thực sự tìm kiếm.

EDIT Khi ghi chú PlasmaHH, gettid() được gọi qua syscall(). Từ trang syscall() người đàn ông:

#define _GNU_SOURCE 
    #include <unistd.h> 
    #include <sys/syscall.h> 
    #include <sys/types.h> 

    int 
    main(int argc, char *argv[]) 
    { 
     pid_t tid; 

     tid = syscall(SYS_gettid); 
    } 
+0

Lưu ý rằng gettid() không có trình bao bọc glibc và cần được gọi qua syscall() – PlasmaHH

+0

@ PlasmaHH - Phải, tôi nên thêm nó. Một cách ngẫu nhiên, trang syscall man sử dụng nó làm ví dụ. – Duck

+0

gettid() là loại [gây tranh cãi] (http://airlied.livejournal.com/74826.html) –

1

pthread_self không không được tid. nó chứng minh một xử lý hoặc con trỏ của loại pthread_t để sử dụng trong các chức năng pthread.

thấy ở đây cho một ví dụ những gì một chương trình thực tế có thể quay trở lại:

http://www.c-plusplus.de/forum/212807-full

1

Trên thực tế pthread_self trở pthread_t và không một sợi nguyên id bạn có thể làm việc với, hàm helper sau đây sẽ giúp bạn có được điều đó trong một cách di động trên các hệ thống POSIX khác nhau.

uint64_t gettid() { 
    pthread_t ptid = pthread_self(); 
    uint64_t threadId = 0; 
    memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid))); 
    return threadId; 
} 
Các vấn đề liên quan