gpt4 book ai didi

c++ - 如何仅在 Concurrency::event 对象现在不处于信号状态时设置它?

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

在我的代码中,只有当特殊事件未处于信号状态时,一些并发工作任务才应该开始工作。代码示例:

tasks.run([&](){
if (event.wait(0)!=0)
{
event.set();

// work code ...
}
})

这样的任务可能有很多实例,只有一个应该工作。但是 wait() 和 set() 是不同的方法,代码不是原子的。因此,可能会出现两个或多个任务实例开始工作的情况。我如何测试事件的信号状态并仅在未发出信号时将其锁定,并以原子方式执行?

最佳答案

看起来你可以使用 mutex::try_lock

代码应该是这样的:

tasks.run([&](){   if (event.wait(0)!=0 && mutex.try_lock()) {      event.set();      mutex.unlock();      // work code ...   }})

不要忘记确保 event.set() 不会抛出异常,否则需要额外的努力才能使此代码异常安全。

也许你应该将整个包装到 while (true) 中以捕获“误报”情况,像那样:

tasks.run([&](){   while(true) {      if (event.wait(0)!=0 && mutex.try_lock()) {         event.set();         mutex.unlock();         // work code ...         break;      }   }});

因此获取锁失败的任务会回到等待状态。

关于c++ - 如何仅在 Concurrency::event 对象现在不处于信号状态时设置它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111822/

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