2012-11-13 28 views
4

如果我有一個std::thread對象t,我可以使用t.native_handle()來訪問基礎線程實現的API(例如,pthread或Windows線程)。但是如果我有一個來自底層線程實現的句柄(例如,一個pthreads線程)。有什麼辦法可以將它轉換成C++ 11 std::thread從本地句柄創建std ::線程?

這樣做的動機是,可能需要使用本地平臺線程API來設置具有特定親和性或特定堆棧大小的線程(或者某些其他無法通過C訪問的特性++ 11 API)。然而,從這一點來看,堅持使用C++ 11功能會很好。

有沒有辦法做到這一點?

回答

6

有了GCC,你可以從std::thread::native_handle_type構建一個std::thread::id,但是你不能從它構造一個std::thread

這意味着您可以測試給定pthread_t是否引用與std::thread對象(或this_thread::get_id())相同的線程,但無法從中創建新的thread對象。

A std::thread被設計爲獨特處理線程。不同的thread對象獲取底層線程的所有權的唯一方法是將其從原始線程移出,因此只有一個對象一次「擁有」它。如果你可以從本地手柄構建它們你可以這樣做:

// start new thread 
std::thread t(&thread_func); 

// now have two handles to the same thread 
std::thread t2(t.native_handle()); 

std::thread t1.join(); 

// erm, hang on, this isn't right 
std::thread t2.join(); 

這樣做的動機是,它可能需要使用本機平臺線程API建立一個線程,例如,特定的親和力或特定的堆棧大小(或其他一些無法通過C++ 11 API訪問的特性)。

理想的平臺將讓你當你構建線程,這樣可以讓你使用這些特定於平臺的功能,而無需通過構建削弱類型的系統指定參數,如親和力或堆棧大小「非擁有」 thread對象......但至少GCC不支持這樣做。