Partager via


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