Ho letto dei modelli di memoria C ++ e penso di avere una conoscenza dei concetti di base che succedono - prima, sincronizza-e inter-thread succede-prima. Tuttavia, applicarli in alcuni esempi è stato difficile. In particolare, ho pensato alla seguente sequenza di operazioni quando sono state ripetute:
Thread 1
1. Atomic store of X in A (seq cst).
2. Write X to B.
3. Atomic store of X in C (seq cst).
Thread 2
4. Atomic load of C.
5. Read of B.
6. Atomic load of A.
Ora so che dopo il 4 Thread 2 devo vedere la scrittura fatta da Thread 1 in 2, ma cosa succede se il Thread 1 sta girando e dopo che 3 sta impostando A, poi B e poi da C a Y? Penso che Thread 2 possa vedere C impostato su X e B su Y perché Thread 1 può avere impostato A e B su Y ma non ha ancora impostato C a Y. Questo è chiaro, ma se Thread 2 controlla A e trova che è impostato su X, significa che Thread 2 deve anche vedere B impostato su X? Ho scritto del codice per far girare Thread 1 e Thread 2 e ho scoperto che se Thread 2 vede lo stesso valore per A e C, anche B ha lo stesso valore. So comunque che questo non lo dimostra, che è la ragione di questa domanda.
Penso che la cosa fondamentale sia se l'atomic store in 1 implica qualcosa sul negozio in 2? Se 2 è stato fatto prima di 1 allora lo fa, ma non è questo il caso. Se il risultato di 2 è visto dal Thread 2 prima che veda i risultati di 1 e 3, il Thread 2 vedrebbe A e C impostati su X ma B su Y. È possibile? Come sarebbe descritto in base ai concetti di cui sopra. Infine, sono entrati in gioco altri fattori che potrebbero significare che il programma che ho scritto funziona (su x86)?