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.
}
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin