Tecnicamente sì, ma non su molte piattaforme. Innanzitutto, supponiamo che int
sia a 32 bit (che è piuttosto comune, ma non quasi universale).
È possibile che le due parole (16 parti) di bit a 32 bit int
verranno letti o scritti separatamente. Su alcuni sistemi, verranno letti separatamente se lo int
non è allineato correttamente.
Immaginate un sistema in cui è possibile eseguire solo letture e scritture a 32 bit allineate a 32 bit (e letture e scritture 16 bit allineate a 16 bit) e uno int
che si trova a cavallo di tale limite. Inizialmente il int
è zero (cioè, 0x00000000
)
Un thread scrive 0xBAADF00D
al int
, l'altro lo legge "allo stesso tempo".
Il thread di scrittura scrive prima 0xBAAD
nella parola alta dello int
. Il thread del lettore legge quindi l'intero int
(sia alto che basso) ottenendo 0xBAAD0000
- che è uno stato in cui lo int
non è mai stato inserito di proposito!
Il thread dello scrittore quindi scrive la parola bassa 0xF00D
.
Come notato, su alcune piattaforme tutte le letture/scritture a 32 bit sono atomiche, quindi questa non è una preoccupazione. Ci sono altre preoccupazioni, tuttavia.
La maggior parte del codice di blocco/sblocco include istruzioni al compilatore per impedire il riordino attraverso il blocco. Senza quella prevenzione del riordino, il compilatore è libero di riordinare le cose fintanto che si comporta come "se" in un contesto a thread singolo avrebbe funzionato in quel modo. Quindi, se leggete a
quindi nel codice, il compilatore potrebbe leggere b
prima di leggere a
, a condizione che non venga visualizzata un'opportunità nel thread per da modificare in tale intervallo.
Probabilmente il codice che stai leggendo usa questi blocchi per assicurarti che la lettura della variabile avvenga nell'ordine scritto nel codice.
Altri problemi vengono sollevati nei commenti seguenti, ma non mi sento competente a risolverli: problemi di cache e visibilità.
Si noti inoltre che C++ 11 afferma che qualsiasi condizione di competizione che coinvolge una scrittura come comportamento non definito. Quindi se scrivi a 'foo_.a' in una discussione diversa, allora sì, è UB. (§1.10/4 e §1.10/21) C++ 03 non dice nulla sulla concorrenza. – Mysticial
Usa 'std :: atomic' se puoi e non ti preoccupare. – GManNickG
Vedi la modifica. Questo codice è limitato ai costrutti C++ 03. – PaulH