Avertissement C26138
Suspension d’une coroutine lors de la conservation du verrou « lock ».
Notes
Avertissement C26138 avertit lorsqu’une coroutine est suspendue lors de la conservation d’un verrou. En général, nous ne pouvons pas savoir combien de temps une coroutine restera dans l’état suspendu afin que ce modèle puisse entraîner des sections critiques plus longues que prévu.
Nom de l’analyse du code : SUSPENDED_WITH_LOCK
Exemples
Le code suivant génère l’erreur 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();
}
Le code suivant corrige ces avertissements.
#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.
}