Compartilhar via


Aviso C26138

Suspendendo uma co-rotina enquanto segura o cadeado 'lock'.

Comentários

O aviso C26138 avisa quando uma coroutina é suspensa enquanto um bloqueio é mantido. Em geral, não podemos saber por quanto tempo uma coroutina permanecerá no estado suspenso, portanto, esse padrão poderá resultar em seções críticas mais longas do que o esperado.

Nome da análise de código: SUSPENDED_WITH_LOCK

Exemplos

O código a seguir gerará o 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();
}

O código a seguir corrigirá esses avisos.

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