Полагая
- no undefined,
- нет взаимоблокировок,
- мьютексы заблокированы и разблокированы в правильном порядке правильными потоками правильное количество раз,
- нерекурсивные мьютексы не блокируются несколько раз,
- блокировка рекурсивных мьютексов не превышает максимального уровня владения,
- предикаты не передаются в переменные условия throw, а
- используются только часы, точки времени и длительности, предоставляемые стандартной библиотекой, с мьютексами
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
или написать несколько блоков try-catch вокруг звонков? Или есть какие-либо оговорки?
Пожалуйста, рассмотрите все типы мьютексов и переменных условий в С++ 11, С++ 14 и более поздних версиях.