Đây là kinda doable, tùy thuộc vào nền tảng mà bạn đang ở trên, nhưng tuyệt đối không trong bất kỳ cách cầm tay và generic ...
Mac OS X dường như là người duy nhất với một cách tiếp cận trực tiếp và ghi nhận, theo pthread.h tập tin của họ:
/* returns non-zero if the current thread is the main thread */
int pthread_main_np(void);
tôi cũng thấy rằng FreeBSD có một tiêu đề pthread_np.h định nghĩa pthread_main_np(), vì thế này nên làm việc trên FreeBSD quá (8.1 ít nhất), và OpenBSD (4.8 ít nhất) có pthread_main_np() được định nghĩa trong pthread.h. Lưu ý rằng _np rõ ràng là viết tắt của không di động!
Nếu không, cách tiếp cận "chung" duy nhất mà bạn nghĩ đến là so sánh PID của quy trình với TID của chuỗi hiện tại, nếu chúng khớp nhau, luồng đó là chính. Điều này không nhất thiết phải hoạt động trên tất cả các nền tảng, nó phụ thuộc vào việc bạn có thực sự có được TID hay không (ví dụ: bạn không thể sử dụng OpenBSD), và nếu có, nếu có bất kỳ mối quan hệ nào với PID hoặc hệ thống con luồng có kế toán riêng của nó mà không nhất thiết liên quan.
Tôi cũng nhận thấy rằng một số nền tảng trả lại giá trị không đổi như TID cho chuỗi chính, vì vậy bạn chỉ có thể kiểm tra các giá trị đó.
Một bản tóm tắt ngắn gọn về nền tảng Tôi đã kiểm tra:
- Linux: thể đây, syscall (SYS_gettid) == getpid() là những gì bạn muốn
- FreeBSD: không thể thực hiện ở đây, thr_self() có vẻ ngẫu nhiên và không có liên quan đến getpid()
- OpenBSD: không thể thực hiện ở đây, không có cách nào để có được một TID
- NetBSD: thể đây, _lwp_self() luôn trả về 1 cho m ain chủ đề
- Solaris: thể đây, pthread_self() luôn trả về 1 đối với các chủ đề chính
Vì vậy, về cơ bản bạn sẽ có thể làm điều đó trực tiếp trên Mac OS X, FreeBSD và OpenBSD.
Bạn có thể sử dụng phương pháp TID == PID trên Linux.
Bạn có thể sử dụng phương pháp TID == 1 trên NetBSD và Solaris.
Tôi hy vọng điều này sẽ giúp bạn có một ngày tốt lành!
Làm cách nào để bạn có được tên người khác có thể đọc được? – Potatoswatter
Cụ thể hơn, mô hình mà 'main' không phù hợp là gì? – Potatoswatter
Phần lớn các chủ đề trong hệ thống được bắt đầu chỉ bằng một số cách. Có mã phổ biến ở đó có thể dựa vào một hàm std :: string name() ảo. Các chủ đề chính là khác nhau mặc dù. –