Ho un codice che deve essere thread-safe ed eccezionalmente sicuro. Il codice che segue è una versione molto semplificata del mio problema:Blocco di un mutex in un distruttore in 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;}
Ho un mutex che ho bisogno di bloccare il distruttore di un oggetto. Il problema è che il mio distruttore non dovrebbe lanciare eccezioni.
Cosa posso fare?
0) Non posso sostituire n
con una variabile atomica (naturalmente sarebbe fare il trucco qui, ma non è questo il punto della mia domanda)
1) ho potuto sostituire il mio mutex con una rotazione di blocco
2) Potrei provare a catturare il blocco in un ciclo infinito finché non acquisirò il blocco senza eccezione sollevata
Nessuna di queste soluzioni sembra molto allettante. Hai avuto lo stesso problema? Come l'hai risolto ?
'Ho un mutex che ho bisogno di bloccare il distruttore di un oggetto' - Sembra una cattiva idea. Invece di fornirci la soluzione e averci risolto i problemi, forse dovresti dirci quale problema stai cercando di risolvere, in modo che possiamo fornire una soluzione migliore. –
@RobertHarvey Quello che voglio veramente fare è inserire le modifiche in una cache condivisa dopo che sono state salvate in un database. – Arnaud