Share via


Advertencia C26138

Suspender una corrutina mientras mantiene el bloqueo "lock".

Comentarios

La advertencia C26138 avisa cuando se suspende una corrutina mientras se mantiene un bloqueo. Por lo general, no podemos saber cuánto tiempo permanecerá una corrutina en estado suspendido, por lo que este patrón puede dar lugar a secciones críticas más largas de lo esperado.

Nombre del análisis de código: SUSPENDED_WITH_LOCK

Ejemplos

El código siguiente generará la advertencia 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();
}

El código siguiente corregirá estas advertencias.

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