gpt4 book ai didi

c++ - 手动释放升压锁?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:58 24 4
gpt4 key购买 nike

为了学习 boost::thread 的组合学,我正在为锁定公共(public)互斥量 (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 可能先完成...);

请不要建议复飞,例如条件变量,我也可以使用,但没有它们必须可以直接完成。

最佳答案

除了在 block 中限定 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();

如果您需要在稍后重新获取互斥量之前释放互斥量,这很有用。

至于加入,只需在所有线程句柄上依次调用join()即可。

关于c++ - 手动释放升压锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9581841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com