2011-07-29 51 views
0

我正在使用boost :: thread,並遇到一些問題。一些提示線程問題C++

問題是,有沒有什麼方法可以在最後一次加入結束之前加入一個線程? 例如,

int id=1; 
void temp() 
{ 
    int theardID = id++; 
    for(int i=0;i<3;i++) 
    { 
     cout<<theardID << " : "<<i<<endl; 
     boost::this_thread::sleep(boost::posix_time::millisec(100)); 
    } 
} 
int main(void) 
{ 
    boost::thread thrd1(temp); 

    thrd1.join(); 

    boost::thread thrd2(temp); 
    boost::thread thrd3(temp);  
    thrd2.join(); 
    thrd3.join(); 
    return 0; 
} 

在這個簡單的例子,輸出的順序可能是:

1:0 
1:1 
1:2 
2:0 
3:0 
3:1 
2:1 
2:2 
3:2 

正如上面的例子中,我們可以看到發現,對於thrd2和thrd3開始後thrd1所完成運行。

在thrd1結束之前是否有任何方法讓thrd2和thrd3運行?

+2

請注意'int theardID = id ++;'是一個競態條件,因爲您有兩個線程同時修改單個變量。它或者需要是原子的,或者是受鎖的保護。 (或者將線程的ID傳遞給構造函數。) – GManNickG

回答

3

您可以使用Boost.Thread的condition variables在比join更復雜的條件下進行同步。這裏有一個例子基於你:

#include <iostream> 
#include <boost/thread.hpp> 
#include <boost/thread/locks.hpp> 
#include <boost/thread/mutex.hpp> 
#include <boost/thread/condition_variable.hpp> 

boost::mutex mutex; 
boost::condition_variable cond; 

// These three variables protected by mutex 
bool finishedFlag = false; 
int finishedID = 0; 
int finishedCount = 0; 

int id=1; 
void temp() 
{ 
    int threadID = id++; 
    for(int i=0;i<3;i++) 
    { 
     std::cout << threadID << " : " << i << std::endl; 
     boost::this_thread::sleep(boost::posix_time::millisec(100)); 
    } 

    { 
     boost::lock_guard<boost::mutex> lock(mutex); 
     finishedFlag = true; 
     finishedID = threadID; 
     ++finishedCount; 
    } 
    cond.notify_one(); 
} 

int main(void) 
{ 
    boost::thread thrd1(temp); 
    boost::this_thread::sleep(boost::posix_time::millisec(300)); 
    boost::thread thrd2(temp); 
    boost::thread thrd3(temp); 

    boost::unique_lock<boost::mutex> lock(mutex); 
    while (finishedCount < 3) 
    { 
     while (finishedFlag != true) 
     { 
      // mutex is released while we wait for cond to be signalled. 
      cond.wait(lock); 

      // mutex is reacquired as soon as we finish waiting. 
     } 
     finishedFlag = false; 

     if (finishedID == 1) 
     { 
      // Do something special about thrd1 finishing 
      std::cout << "thrd1 finished" << std::endl; 
     } 
    }; 

    // All 3 threads finished at this point. 

    return 0; 
} 
3

join功能的意思是「停止此線程,直到該線程完成。」這是一個簡單的工具,用於簡單的目的:確保在代碼中超過這一點,線程X完成。

你想要做的並不是join操作。你想要的是某種同步原語來傳達和同步線程之間的行爲。 Boost.Thread有一個number of alternatives for synchronization,從條件到互斥。