boost::thread の組み合わせ論を学習するために、共通ミューテックス (M) をロックするスレッド用の単純なバリア (BR) を実装しています。ただし、BR.wait() に移動したときに得られる限り、ミューテックスのロックは解放されないため、すべてのスレッドが BR に到達するには、M のロックを手動で解放する必要があります。だから私は次のコードを持っています:
boost::barrier BR(3);
boost::mutex M;
void THfoo(int m){
cout<<"TH"<<m<<" started and attempts locking M\n";
boost::lock_guard<boost::mutex> ownlock(M);
cout<<"TH"<<m<<" locked mutex\n";
Wait_(15); //simple wait for few milliseconds
M.unlock(); //probably bad idea
//boost::lock_guard<boost::mutex> ~ownlock(M);
// this TH needs to unlock the mutex before going to barrier BR
cout<<"TH"<<m<<" unlocked mutex\n";
cout<<"TH"<<m<<" going to BR\n";
BR.wait();
cout<<"TH"<<m<<" let loose from BR\n";
}
int main()
{
boost::thread TH1(THfoo,1);
boost::thread TH2(THfoo,2);
boost::thread TH3(THfoo,3);
TH2.join(); //but TH2 might end before TH1, and so destroy BR and M
cout<<"exiting main TH \n";
return 0;
}
M.unlock() は明らかに悪い解決策です (ロックを使用しない)。では、ロックを(単に)解除する方法は?また、すべてのスレッドが終了するまで main() で (適切に) 待機するにはどうすればよいですか? (TH2.join() はまずい。TH2 が最初に終了する可能性があるため...);
私も使用できる条件変数を使用するなど、回避策を提案しないでください。