Vous avez mal entendu. Il se peut que ce "i++"
soit thread-safe pour un compilateur et une architecture de processeur spécifiques, mais ce n'est pas du tout obligatoire dans les normes. En fait, comme le multi-threading ne fait pas partie des normes ISO C ou C ++ (a) , vous ne pouvez pas considérer que quoi que ce soit soit thread-safe en fonction de ce à quoi vous pensez qu'il sera compilé.
Il est tout à fait possible de ++i
compiler en une séquence arbitraire telle que:
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
qui ne serait pas thread-safe sur mon processeur (imaginaire) qui n'a pas d'instructions d'incrémentation de mémoire. Ou cela peut être intelligent et le compiler en:
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)
où lock
désactive et unlock
active les interruptions. Mais, même dans ce cas, cela peut ne pas être thread-safe dans une architecture qui a plus d'un de ces processeurs partageant la mémoire (le lock
peut désactiver uniquement les interruptions pour un processeur).
Le langage lui-même (ou les bibliothèques pour lui, s'il n'est pas intégré au langage) fournira des constructions thread-safe et vous devriez les utiliser plutôt que de dépendre de votre compréhension (ou peut-être d'un malentendu) du code machine qui sera généré.
Des choses comme Java synchronized
et pthread_mutex_lock()
(disponibles pour C / C ++ sous certains systèmes d'exploitation) sont ce que vous devez examiner (a) .
(a) Cette question a été posée avant l'achèvement des normes C11 et C ++ 11. Ces itérations ont maintenant introduit la prise en charge des threads dans les spécifications du langage, y compris les types de données atomiques (bien qu'ils, et les threads en général, soient facultatifs, au moins en C).