Mam kod, który musi być bezpieczny dla wątków i wyjątek bezpieczny. Poniższy kod jest bardzo uproszczoną wersją mojego problemu:Blokowanie muteksu w destruktorze w C++ 11
#include <mutex>
#include <thread>
std::mutex mutex;
int n=0;
class Counter{
public:
Counter(){
std::lock_guard<std::mutex>guard(mutex);
n++;}
~Counter(){
std::lock_guard<std::mutex>guard(mutex);//How can I protect here the underlying code to mutex.lock() ?
n--;}
};
void doSomething(){
Counter counter;
//Here I could do something meaningful
}
int numberOfThreadInDoSomething(){
std::lock_guard<std::mutex>guard(mutex);
return n;}
Mam muteks, który muszę zablokować w destruktorze obiektu. Problem polega na tym, że mój destruktor nie powinien generować wyjątków.
Co mogę zrobić?
0) Nie mogę zastąpić n
ze zmienną atomowej (oczywiście byłoby załatwić sprawę tutaj, ale to nie o to chodzi w moim pytaniu)
1) mogę wymienić mój mutex z korkociągu zablokować
2) Mogę spróbować złapać blokadę w nieskończoną pętlę, aż ostatecznie zdobędę blokadę bez wyjątku podniesionego.
Żadne z tych rozwiązań nie wydaje się bardzo atrakcyjne. Czy masz ten sam problem? Jak to rozwiązałeś?
"Mam muteks, który muszę zablokować w destruktorze obiektu" - brzmi jak zły pomysł. Zamiast dostarczania nam rozwiązania i usuwania z nim problemów, może powinieneś nam powiedzieć, jaki problem próbujesz rozwiązać, abyśmy mogli zapewnić lepsze rozwiązanie. –
@RobertHarvey Co naprawdę chcę zrobić, to wstawianie modyfikacji do współużytkowanej pamięci podręcznej po ich zapisaniu w bazie danych. – Arnaud