2011-09-21 35 views
0

boost::condition_variable其等待線程來完成:加入後線程上的共享指針數爲1?

boost::condition_variable mContd; 
boost::shared_ptr<boost::thread> mThread; 

試想一下,線程開始前一段時間,現在等待:

if(!mContd.timed_wait(tLock, boost::posix_time::seconds(1))) { 
    // cancel thread if deadline is reached 
    mThread.interrupt(); 
    mThread.join(); 

    std::cout 
    << "Thread count = " 
    << mThread.use_count() // still prints '1' 
    << std::endl; 

} else { 
    // continue 
} 

所以,當這個計數設​​爲零?我假設,join之後線程完成。但是什麼時候?

回答

2

use_count()只是告訴你多少個shared_ptr對象指向相同的boost::thread對象。它與線程是否終止無關。

mThread超出範圍時,計數器將自動減少。

如果您不再需要thread對象,可以撥打mThread.reset()。這也會導致mThread.use_count()下降到零。

+0

這意味着,如果mThread是全球性的,只有程序結束後?按照預期,在程序開始時,'use_count'是一個零。 – Benjamin

+0

@Benjamin:啓動時爲零,因爲共享指針是空的。你可以通過調用'mThread.reset()'來重新清空它。看到我更新的答案。 – NPE

1

對象無法像這樣正確刪除自己。

當線程終止時,表示它的boost::thread對象進入「完成」狀態,但它仍然必須「存在」,因爲shared_ptr正在控制它。你還有一個,現在 - 「完成」 boost::thread對象,你有過,所以計數仍爲1

事實上,在一般情況下,boost::shared_ptr::use_count()只有返回0時,它表示「空指針」而不是存在的實際對象。

直接類比如下:

boost::thread mThread(&f); // Create thread object 

mThread.interrupt(); 
mThread.join();   // Thread is now "finished" 

cout << (mThread.get_id() == boost::thread::id()); 
//^Outputs `true`, because the object mThread is now in the 
// not-a-thread state, but of course it still must exist.