Ho letto molte domande considerando il blocco a doppio controllo sicuro per thread (per singleton o init pigro). In alcuni thread, la risposta è che il pattern è completamente infranto, altri suggeriscono una soluzione.C++ 11: blocco doppio controllo sicuro per l'inizializzazione pigra. Possibile?
Quindi la mia domanda è: esiste un modo per scrivere un modello di blocco a doppio controllo completamente protetto da thread in C++? Se è così, com'è?
Possiamo assumere C++ 11, se questo rende le cose più facili. Per quanto ne so, C++ 11 ha migliorato il modello di memoria che potrebbe produrre i miglioramenti necessari.
So che è possibile in Java rendendo volatile la variabile a doppio controllo controllata. Dal momento che C++ 11 ha preso in prestito grandi parti del modello di memoria da quello di Java, quindi penso che potrebbe essere possibile, ma come?
Se è possibile utilizzare C++ 11, ignorare l'intera attività di blocco con doppia verifica e utilizzare le variabili locali statiche o 'std :: call_once'. –
I locals statici sono inizializzati pigramente? E su 'call_once': come fa a garantire che la chiamata una volta non scriva il riferimento non completamente creato alla variabile? – gexicide
sì, i locals statici sono inizializzati pigramente in modo thread-safe. E 'call_once' garantisce che il soggetto venga chiamato sempre una volta sola; e che nessun'altra chiamata a 'call_once' ritorna prima che quello che esegue effettivamente la funzione ritorni (puoi leggere di più qui http://en.cppreference.com/w/cpp/thread/call_once). Come lo è fino all'implementazione. Queste due cose esistono fondamentalmente, quindi non ti interessa preoccuparti di scrivere più bug
implementazioni di blocco a doppio controllo. –