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()가 명확하게 (잠금을 사용하지 않는) 나쁜 솔루션입니다 반면; 그래서 (단순히) 자물쇠를 해제하는 방법? 또한 : 어떻게 maint()에서 (모든) 스레드가 완료 될 때까지 (올바르게) 기다려야합니까? (TH2.join()이 나쁘다. 왜냐하면 TH2가 먼저 끝날 수 있기 때문이다.);
다음과 같은 내용을 제안하지 마십시오. 조건부 변수를 사용할 수도 있지만, 직접 변수없이 수행 할 수 있어야합니다.
쿨, 고마워요 ... –