Ho una variabile int foo
a cui si accede da due thread. Supponendo di non avere problemi relativi alla condizione di razza (l'accesso è protetto da un mutex, tutte le operazioni sono atomiche, o qualsiasi altro metodo per proteggere dalle condizioni di gara), c'è ancora il problema di "registrare il caching" (per mancanza di un nome migliore) , in cui il compilatore può supporre che se la variabile viene letto due volte senza essere scritta in mezzo, è lo stesso valore, e così può "ottimizzare" le cose via come:`volatile` per la sincronizzazione variabile tra i thread
while(foo) { // <-may be optimized to if(foo) while(1)
do-something-that-doesn't-involve-foo;
}
o
if(foo) // becomes something like (my assembly is very rusty): mov ebx, [foo]; cmp ebx, 0; jz label;
do-something-that-doesn't-involve-foo;
do-something-else-that-doesn't-involve-foo;
if(foo) // <-may be optimized to jz label2;
do-something;
la marcatura foo
come volatile
risolve questo problema? Le modifiche da un thread sono garantite per raggiungere l'altro thread?
In caso contrario, quale altro modo c'è per farlo? Ho bisogno di una soluzione per Linux/Windows (possibilmente soluzioni separate), senza C++ 11.
ho ricordate di vedere una citazione dallo standard pronunciando la non suppone di utilizzare volatile per le discussioni più, in C++, cercherò di trovarlo – aaronman
http: // StackOverflow.it/questions/4557979/when-to-use-volatile-with-multi-threading –
Il problema qui è "Supponendo che non abbia problemi di condizioni di gara". Questa è un'ipotesi ** ENORME **. –