2016-08-26 15 views
1

条件変数を使用して、2つのスレッドから順番に番号の印刷を実装しようとしています.1つは偶数番号を印刷し、もう1つは奇数番号を印刷します。ブースト条件変数を使ってスコープ付きロックをブーストする

#include <iostream> 
#include <boost/thread.hpp> 
#include <condition_variable> 
using namespace std; 

boost::mutex m; 
boost::condition_variable cv_even; 
boost::condition_variable cv_odd; 
bool even_done = false; 
bool odd_done = false; 
bool wait_main = true; 
void odd_printer(){ 
    cout<<"Start odd\n"; 
    int i = 0; 
    while(true){ 
    boost::mutex::scoped_lock lock(m); 
    cout<<"Odd acquired lock " << i << endl; 
    while(!even_done) cv_odd.wait(lock); 
    if(i % 2 == 1){ 
     cout<<i<<endl; 
    } 
    i++; 
    even_done = false; 
    odd_done = true; 
    cv_even.notify_one(); 
    } 
} 

void even_printer(){ 
    cout<<"Start even\n"; 
    int i = 0; 
    while(true){ 
    boost::mutex::scoped_lock lock(m); 
    cout<<"Even acquired lock " << i << endl; 
    while(!odd_done) cv_even.wait(lock); 
    if(i % 2 == 0){ 
     cout<<i<<endl; 
    } 
    i++; 
    odd_done = false; 
    even_done = true; 
    cv_odd.notify_one(); 
    cout<<"End scope even\n"; 
    } 
} 

int main(){ 
    boost::thread odd_t{odd_printer}; 
    boost::thread even_t{even_printer}; 
    sleep(2); 
    odd_done = true; 
    cv_even.notify_one(); 
    odd_t.join(); 
    even_t.join(); 
} 

sleep(2)文が終了する前に私が手出力は次のようになります。

Start even 
Even acquired lock 0 
Start odd 
Odd acquired lock 0 

はどのように両方のスレッドがミューテックスメートルのロックを取得することができます。言い換えれば、文boost::mutex::scoped_lock lock(m);は両方のスレッドで処理されます。それらのうちの1人が他の人が最初にミューテックスmのロックを解放するのを待つべきではありませんか?

答えて

2

この方法では、cv.wait(lock)がロックを解除し、ロックする前に再びロックします。それは他のスレッドがロックして続ける方法です。そのため、ロックを待機関数に渡す必要があります。

理想的には、メインは共有フラグにアクセスする前にロックするのが理想的です。

関連する問題