Ради изучения комбинаторики boost :: thread Я реализую простой барьер (BR) для потоков, которые блокируют общий мьютекс (M). Однако, насколько я понимаю, при переходе в 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 может закончить первым ...);
Пожалуйста, не предлагайте уходы, например с условными переменными, которые я также могу использовать, но это должно быть возможно сделать прямо без них.