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のロックを解放するのを待つべきではありませんか?