Warnung C26138

Anhalten eines Coroutins beim Halten der Sperre "Lock".

Hinweise

Warnung C26138 warnt, wenn ein Coroutine angehalten wird, während er eine Sperre hält. Im Allgemeinen können wir nicht wissen, wie lange eine Coroutine re Standard im angehaltenen Zustand, sodass dieses Muster zu längeren kritischen Abschnitten führen kann als erwartet.

Codeanalysename: SUSPENDED_WITH_LOCK

Beispiele

Der folgende Code generiert 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();
}

Der folgende Code korrigiert diese Warnungen.

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