.. title:: clang-tidy - cppcoreguidelines-no-suspend-with-lock
cppcoreguidelines-no-suspend-with-lock
======================================
Flags coroutines that suspend while a lock guard is in scope at the
suspension point.
When a coroutine suspends, any mutexes held by the coroutine will remain
locked until the coroutine resumes and eventually destructs the lock guard.
This can lead to long periods with a mutex held and runs the risk of deadlock.
Instead, locks should be released before suspending a coroutine.
This check only checks suspending coroutines while a lock_guard is in scope;
it does not consider manual locking or unlocking of mutexes, e.g., through
calls to ``std::mutex::lock()``.
Examples:
.. code-block:: c++
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
}
This check implements `CP.52
<https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rcoro-locks>`_
from the C++ Core Guidelines.