C ++ 14似乎省略了一种检查an是否std::mutex
被锁定的机制。看到这样的问题:
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
有几种解决方法,例如通过使用;
std::mutex::try_lock()
std::unique_lock::owns_lock()
但是这些都不是特别令人满意的解决方案。
try_lock()
如果当前线程已锁定互斥锁,则允许返回假阴性,并且具有未定义的行为。它也有副作用。owns_lock()
需要unique_lock
在原始的基础上进行构造std::mutex
。
显然我可以自己动手,但我宁愿了解当前界面的动机。
std::mutex::is_locked()
对我来说,检查互斥对象状态的能力似乎并不神秘,因此我怀疑标准委员会故意忽略了此功能,而不是疏忽大意。
为什么?
编辑:好的,也许这个用例并不像我预期的那么普遍,所以我将举例说明我的特殊情况。我有一个分布在多个线程上的机器学习算法。每个线程异步运行,并在完成优化问题后返回到主池。
然后锁定主互斥锁。然后,该线程必须选择一个新的父代来从其变异后代,但只能从当前没有其他线程正在优化的后代的父代中选择。因此,我需要执行搜索以找到当前未被另一线程锁定的父母。由于主线程互斥锁已锁定,因此互斥锁的状态不会在搜索过程中发生变化。显然,还有其他解决方案(我目前正在使用布尔标志),但是我认为互斥锁为该问题提供了一种逻辑解决方案,因为它存在于线程间同步的目的。
is_locked
?