Peringatan C26138

Menangguhkan koroutine sambil memegang kunci 'kunci'.

Keterangan

Peringatan C26138 memperingatkan ketika koroutin ditangguhkan saat memegang kunci. Secara umum, kita tidak dapat tahu berapa lama koroutine akan tetap dalam keadaan ditangguhkan sehingga pola ini dapat mengakibatkan bagian kritis yang lebih lama dari yang diharapkan.

Nama analisis kode: SUSPENDED_WITH_LOCK

Contoh

Kode berikut akan menghasilkan 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();
}

Kode berikut akan memperbaiki peringatan ini.

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