警告 C26138
持有锁定“lock”时挂起协同例程。
备注
持有锁时,警告 C26138 在协同例程挂起时发出警告。 一般情况下,我们无法得知协同例程会在挂起状态下保持多长时间,因此该模式可能会导致关键部分比预期更长。
代码分析名称:SUSPENDED_WITH_LOCK
示例
下面的代码将生成 C26138。
#include <experimental/generator>
#include <future>
#include <mutex>
using namespace std::experimental;
std::mutex global_m;
_Guarded_by_(global_m) int var = 0;
generator<int> mutex_acquiring_generator() {
global_m.lock();
++var;
co_yield 1; // @expected(26138), global_m is hold while yielding.
global_m.unlock();
}
generator<int> mutex_acquiring_generator_report_once() {
global_m.lock();
++var;
co_yield 1; // @expected(26138), global_m is hold while yielding.
co_yield 1; // @expected(26138), global_m is hold while yielding.
global_m.unlock();
}
下面的代码将会更正这些警告。
#include <experimental/generator>
#include <future>
#include <mutex>
using namespace std::experimental;
std::mutex global_m;
_Guarded_by_(global_m) int var = 0;
generator<int> mutex_acquiring_generator2() {
{
global_m.lock();
++var;
global_m.unlock();
}
co_yield 1; // no 26138, global_m is already released above.
}