Udostępnij za pośrednictwem


Ostrzeżenie C26138

Wstrzymywanie coroutine przy zachowaniu blokady "lock".

Uwagi

Ostrzeżenie C26138 ostrzega, gdy coroutine jest zawieszona podczas przechowywania blokady. Ogólnie rzecz biorąc, nie możemy wiedzieć, jak długo kohroutyna pozostanie w stanie wstrzymania, więc ten wzorzec może spowodować dłuższe sekcje krytyczne niż oczekiwano.

Nazwa analizy kodu: SUSPENDED_WITH_LOCK

Przykłady

Poniższy kod spowoduje wygenerowanie kodu 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();
}

Poniższy kod poprawi te ostrzeżenia.

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