2012-07-13 32 views
7

là thre bất kỳ cách relieable trong c + + 11 để phát hiện nếu thread hiện tại là chủ đề chính? Hoặc tôi có phải lưu thủ công chuỗi chủ đề chính với std::this_thread::get_id() và sau đó có thói quen như sau:std :: thread phát hiện thread chính

bool isMainThread() 
{ 
    return theMainThreadIdISavedOnProgramStart == std::this_thread::get_id(); 
} 

Có cách nào phổ biến để làm điều này? Giải pháp trên có hoạt động không?

Cảm ơn

+2

Bạn cũng có thể đặt cờ trong bộ nhớ cục bộ nhưng tôi không chắc liệu TLS có khả dụng rộng rãi tại thời điểm này hay không. – dasblinkenlight

Trả lời

8

Ý của bạn là gì? Nếu bạn có nghĩa là, thread mà thực hiện main(), sau đó không có cách nào bạn có thể biết nếu một sợi là một chủ đề chính hay không. Bạn phải lưu ID của nó và sau đó bạn có thể sử dụng ID đã lưu để biết liệu chuỗi hiện tại có phải là chuỗi chính hay không, bằng cách so sánh ID của nó với ID đã lưu (như bạn đã đoán trong câu hỏi của mình).

Để giải thích thêm một chút, chủ đề không có phân cấp, không có chuỗi gốc, không có chuỗi con ngay cả khi một chuỗi tạo các chuỗi khác. Hệ điều hành không nhớ chủ đề nào được tạo bởi chuỗi nào. Vì vậy, tất cả các chủ đề giống với hệ điều hành và chương trình của bạn. Vì vậy, bạn không thể suy ra một chuỗi main, bằng cách phát hiện xem chuỗi hiện tại có phải là phụ huynh của tất cả các chuỗi khác trong ứng dụng của bạn hay không.

+1

cảm ơn lời giải thích! Tôi thực sự quan tâm đến việc thực hiện thread chính()! Tôi sẽ tự lưu id sau đó! Cảm ơn bạn! – moka

+3

Câu trả lời đúng. Là một sidenote và tùy thuộc vào nền tảng, trên nền tảng POSIX chạy FreeBSD, OpenBSD, Mac OS X hoặc iOS, có một hàm trong pthread.h - int pthread_main_np (void); Điều này trả về khác không nếu chủ đề là chủ đề chính. Nếu bạn đã sinh ra một luồng bằng cách sử dụng std :: thread, hàm cơ bản này sẽ hoạt động chính xác. Lưu ý "np" ở cuối hàm có nghĩa là "không di động", vì vậy Nawaz vẫn có câu trả lời độc lập nền tảng tốt nhất. – NSDestr0yer

Các vấn đề liên quan