Aracılığıyla paylaş


Uyarı C26138

'Lock' kilidini tutarken bir coroutine'i askıya alma.

Açıklamalar

Uyarı C26138, kilit tutarken bir coroutine askıya alındığında uyarır. Genel olarak, bir eş yordam askıya alınmış durumda ne kadar süre kalacak bilmiyoruz, bu nedenle bu desen beklenenden daha uzun kritik bölümlere neden olabilir.

Kod analizi adı: SUSPENDED_WITH_LOCK

Örnekler

Aşağıdaki kod C26138 oluşturur.

#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();
}

Aşağıdaki kod bu uyarıları düzeltecektir.

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