Hai sentito male. Potrebbe anche essere "i++"
thread-safe per un compilatore specifico e un'architettura di processore specifica, ma non è affatto obbligatorio negli standard. In effetti, poiché il multi-threading non fa parte degli standard ISO C o C ++ (a) , non puoi considerare nulla come thread-safe in base a ciò che pensi che verrà compilato.
È abbastanza fattibile che ++i
possa compilare una sequenza arbitraria come:
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
che non sarebbe thread-safe sulla mia CPU (immaginaria) che non ha istruzioni di incremento della memoria. Oppure potrebbe essere intelligente e compilarlo in:
lock ; disable task switching (interrupts)
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
unlock ; enable task switching (interrupts)
dove lock
disabilita e unlock
abilita gli interrupt. Ma, anche in questo caso, questo potrebbe non essere thread-safe in un'architettura che ha più di una di queste CPU che condividono la memoria ( lock
potrebbero disabilitare gli interrupt solo per una CPU).
Il linguaggio stesso (o le relative librerie, se non è integrato nel linguaggio) fornirà costrutti thread-safe e dovresti usarli piuttosto che dipendere dalla tua comprensione (o forse incomprensione) di quale codice macchina verrà generato.
Cose come Java synchronized
e pthread_mutex_lock()
(disponibile per C / C ++ in alcuni sistemi operativi) sono ciò che devi esaminare (a) .
(a) Questa domanda è stata posta prima del completamento degli standard C11 e C ++ 11. Queste iterazioni hanno ora introdotto il supporto del threading nelle specifiche del linguaggio, inclusi i tipi di dati atomici (sebbene essi, e i thread in generale, siano opzionali, almeno in C).