作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的代码中,只有当特殊事件未处于信号状态时,一些并发工作任务才应该开始工作。代码示例:
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/
我是一名优秀的程序员,十分优秀!