警告 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.
}