Avviso C26138
Sospensione di una coroutine mentre mantiene il blocco 'lock'.
Osservazioni:
Avviso C26138 avvisa quando una coroutine viene sospesa durante l'attesa di un blocco. In generale, non è possibile sapere per quanto tempo una coroutine rimarrà nello stato sospeso, in modo che questo modello possa comportare sezioni critiche più lunghe del previsto.
Nome dell'analisi del codice: SUSPENDED_WITH_LOCK
Esempi
Il codice seguente genererà 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();
}
Il codice seguente correggerà questi avvisi.
#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.
}