假设异常处理<mutex>和<condition_variable>
- 没有发生不确定的行为,
- 无死锁发生,
- 互斥由正确的线程正确数量的锁定和解锁以正确的顺序次,
- 非递归互斥锁未锁定多次,
- 锁定递归互斥锁不超过maximum level of ownership, 个
- 没有谓词传递给条件变量扔,并
- 只钟表,时间点和持续时间由标准库提供与
std::
互斥和条件变量
是用它保证了操作上的不同类型的std::
互斥锁和条件变量(除构造它们之外)不会抛出任何异常(尤其是类型std::system_error
)?
例如,在类似的方法情况:
void MyClass::setVariable() {
std::lock_guard<std::mutex> const guard(m_mutex);
m_var = 42; // m_var is of type int
m_conditionVariable.notify_all();
}
void MyClass::waitVariable() {
std::unique_lock<std::mutex> lock(m_mutex);
m_conditionVariable.wait(lock, [this]() noexcept { return m_var == 42; });
}
它是安全的假设noexcept
还是应该写一个各地callsites一些的try-catch块?或者有任何警告?
请考虑C++ 11,C++ 14及更高版本中的所有类型的互斥锁和条件变量。
你可以通过linux上的futex()实现来查找失败的条件:https://github.com/torvalds/linux/blob/master/kernel/futex.c#L3147 – Arvid
'std :: condition_variable :: wait()'在C++中更改为'noexcept' 14。当重新获取锁定失败时,它现在只调用'std :: terminate()'。你可能想考虑一下。 – TFM
@TFM我不同意。你能引用一些文件吗? –