Ho bisogno di impostare un flag per un altro thread per uscire. Quell'altro thread controlla di volta in volta il flag di uscita. Devo usare atomico per la bandiera o solo un semplice bool è sufficiente e perché (con un esempio di cosa esattamente potrebbe andare storto se uso il bool semplice)?Devo usare atomico <bool> per la variabile boolea "exit"?
#include <future>
bool exit = false;
void thread_fn()
{
while(!exit)
{
//do stuff
if(exit) break;
//do stuff
}
}
int main()
{
auto f = std::async(std::launch::async, thread_fn);
//do stuff
exit = true;
f.get();
}
Riesco a malapena a vedere come l'accesso a un "bool" possa essere tutt'altro che atomico nella pratica (sebbene io sia d'accordo in uno standard formale, è tutta un'altra questione). Ad ogni modo, a prescindere dalla condizione di competizione stessa, credo che occorra anche una barriera di memoria (fornita da 'atomic <>' o 'std :: mutex') per assicurare che il compilatore non memorizzi i dati nella cache o riordini le istruzioni. Tuttavia mi manca la conoscenza teorica per spiegarlo correttamente (anche se so come usarlo nella pratica), mi raccomando di illuminarmi se puoi? O dovrei creare una nuova domanda? – syam
Per elaborare (in modo restrittivo), la condizione di race dei dati nello standard non riguarda solo ciò che un thread può fare che è visibile ad un altro thread. Riguarda anche l'ottimizzazione o il riordino del codice. Un compilatore non può assumere razze di dati, quindi può presumere che se un thread legge una variabile ma non la modifica, il valore non può cambiare tra i punti di sincronizzazione. Il tuo thread potrebbe non uscire mai. Oppure se un thread imposta un flag senza usarlo, la modifica può essere riordinata prima di qualsiasi altro codice (dopo l'ultimo punto di sincronizzazione). Sto persino ignorando la coerenza della cache. Questo è il motivo per cui l'atomica esiste. –
@Andy cita esattamente al punto - abbastanza per me da usare l'atomico. Spero che Pete nella sua risposta chiarisca la descrizione dei problemi reali nel mio codice di esempio che può derivare dall'uso di bool semplice. –
PowerGamer