Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
}