Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.
}