手动释放增强锁?

P M*_*cki 4 c++ multithreading boost-thread boost-mutex

为了学习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;  
}
Run Code Online (Sandbox Code Playgroud)

而M.unlock()显然是一个糟糕的解决方案(不使用锁); 那么如何(简单地)释放锁?另外:我如何(正确)在main()中等待所有线程完成?(TH2.join()很糟糕,因为TH2可能先完成......);

请不要建议复飞,例如使用条件变量,我也可以使用它,但必须可以在没有条件变量的情况下直接进行.

liw*_*iwp 8

除了boost::lock_guard在块中确定范围之外,您还可以使用boost::unique_lock可以unlock()明确显示的内容:

boost::unique_lock<boost::mutex> ownlock(M);

cout<<"TH"<<m<<" locked mutex\n";
Wait_(15); //simple wait for few milliseconds

ownlock.unlock();
Run Code Online (Sandbox Code Playgroud)

如果您需要在以后重新获取互斥锁之前释放互斥锁,这将非常有用.

至于连接,只需join()依次调用所有线程句柄.