cppcoreguidelines-no-suspend-with-lock¶
标记在挂起点处锁守卫在作用域内时挂起的协程。
当协程挂起时,协程持有的任何互斥锁将一直保持锁定状态,直到协程恢复并最终销毁锁守卫。这会导致互斥锁长时间被持有,并存在死锁的风险。
相反,应在挂起协程之前释放锁。
此检查仅检查在锁守卫在作用域内时挂起的协程;它不考虑对互斥锁的手动锁定或解锁,例如通过调用 std::mutex::lock()
。
示例
future bad_coro() {
std::lock_guard lock{mtx};
++some_counter;
co_await something(); // Suspending while holding a mutex
}
future good_coro() {
{
std::lock_guard lock{mtx};
++some_counter;
}
// Destroy the lock_guard to release the mutex before suspending the coroutine
co_await something(); // Suspending while holding a mutex
}
此检查实现了来自 C++ 核心准则的 CP.52。