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