2015-04-03 90 views
0

是什麼沒有啓動線程實例線程名

MyClass* myClass = new MyClass; 
std::thread myThread(&MyClass::MyMemberFunction, myClass); 

std::thread(&MyClass::MyMemberFunction, myClass); 

之間的區別?

P.S.嘗試使用第二種方法將boost :: asio :: io_service放入單獨的線程 - 不起作用。但是第一個呢。如果將std改爲boost,則兩種方法都可以工作。

WIndows 7. MSVS 12.0。

回答

5

第一個創建一個線程對象,您必須在某個時刻分離或加入。

第二個創建並銷燬一個臨時線程,終止程序,因爲你沒有分離或加入它。 Boost允許它在銷燬時自動分離線程;但是這種行爲會導致細微的錯誤,所以標準庫迫使你做出明確的選擇。

如果你真的想要一個「射後不理」線程,你可以做

std::thread(&MyClass::MyMemberFunction, myClass).detach(); 

,但它通常是更好地保持一個線程對象加入,在合適的時間,特別是如果你打算delete myClass在某一點。