Vous avez mal entendu. Il se pourrait bien qu' "i++"
est thread-safe pour un compilateur spécifique et spécifique de l'architecture du processeur, mais il n'est pas obligatoire dans les normes. En fait, depuis le multi-threading n'est pas une partie de l'ISO C ou C++ normes (a), vous ne pouvez pas envisager de quoi être thread-safe basé sur ce que vous pensez qu'il va compiler vers le bas.
C'est tout à fait possible qu' ++i
pourrait compiler arbitraire séquence telle que:
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
ce qui ne serait pas "thread-safe" sur mon (imaginaire) CPU qui n'a pas de mémoire incrémenter les instructions. Ou il peut être intelligent et de les compiler en une:
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
permet d'interruptions. Mais, même alors, ce ne sont pas thread-safe dans une architecture qui a plus d'un de ces Processeurs de partage de la mémoire ( lock
ne peut désactiver les interruptions pour un PROCESSEUR).
Le langage lui-même (ou bibliothèques pour elle, si elle n'est pas intégré dans la langue) fournira thread-safe constructions et vous devez l'utiliser, plutôt que de dépendre de votre compréhension (ou peut-être l'incompréhension) de ce code machine sera généré.
Des choses comme Java synchronized
et pthread_mutex_lock()
(C/C++ sous certains systèmes d'exploitation) sont ce que vous devez rechercher dans (un).
(a) Cette question a été posée avant le C++11 standard a été achevée. Cette itération de la norme a présenté le filetage de la prise en charge de la spécification du langage, y compris les sémaphores d'exclusion mutuelle semblables à des threads POSIX et des opérations atomiques.