Nie podano, jaka jest zmienna mutex
, ale zakładając, że jest to std::mutex
(lub coś podobnego, co ma na celu zagwarantowanie wzajemnego wykluczenia), kompilator nie może wykonywać wielu optymalizacji. Nie musisz więc martwić się o optymalizację wartości zwracanej lub inną optymalizację, która umożliwia wykonanie zapytania poza blokiem mutex.
Jednak po zwolnieniu blokady mutex, inny wątek jest wolny, aby uzyskać dostęp do wektora i ewentualnie go zmutować, zmieniając w ten sposób rozmiar. Teraz liczba zwrócona przez twoją funkcję jest nieaktualna. Jak wspomina Mats Petersson w swoim answer, jeśli jest to problem, to blokada muteks musi zostać nabyta przez wywołującego getNumber()
i jest utrzymywana do czasu, aż wywołujący zostanie użyty przy użyciu wyniku. Zapewni to, że rozmiar wektora nie zmieni się podczas operacji.
jawne wywołanie mutex::lock
następnie mutex::unlock
szybko staje się niewykonalne dla bardziej skomplikowanych funkcji obejmujących wyjątki, wiele instrukcji powrotne itp Znacznie łatwiej Alternatywą jest użycie std::lock_guard
nabyć blokadę mutex.
int getNumber()
{
std::lock_guard<std::mutex> l(mutex); // lock is acquired
int size = someVector.size();
return size;
} // lock is released automatically when l goes out of scope
Tutaj jest wyjaśnienie niestabilności: http://stackoverflow.com/questions/154551/volatile-vs-interlocked-vs-lock – Will
@Chyba nie uważam, że C# 'volatile' jest tym samym co C++' volatile' (choć byłoby to bezużyteczne w obu językach w tej sytuacji). –
Ooops, nie widziałem, żeby ta odpowiedź była dla C++. Oto lepsze wyjaśnienie volatile: http://stackoverflow.com/questions/72552/why-does- volatile-exist – Will