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