2011-07-29 17 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ことを見つける見ることができるとthrd1終了後に実行を開始thrd3 。

はthrd2をできるようにしてthrd1仕上げの前に実行thrd3任意の方法はありますか?

+2

'int型theardID = ID ++があることに注意してください。あなたが一度に単一の変数を変更する2つのスレッドを持っているように、'、競合状態です。アトミックであるか、ロックによって保護されている必要があります。 (または、スレッドのIDをコンストラクタに渡します。) – GManNickG

答えて

3

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には条件からmutexまでのnumber of alternatives for synchronizationがあります。

関連する問題