Freigeben über


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 ein Coroutine im angehaltenen Zustand verbleibt, sodass dieses Muster zu längeren kritischen Abschnitten führen kann als erwartet.

Name der Codeanalyse: 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.
}