Você ouviu errado. Pode muito bem ser que "i++"
seja thread-safe para um compilador específico e uma arquitetura de processador específica, mas não é obrigatório nos padrões. Na verdade, como o multi-threading não faz parte dos padrões ISO C ou C ++ (a) , você não pode considerar nada como thread-safe com base no que você acha que será compilado.
É bastante viável que ++i
possa compilar em uma sequência arbitrária, como:
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
que não seria thread-safe em minha CPU (imaginária) que não tem instruções de incremento de memória. Ou pode ser inteligente e compilá-lo em:
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)
onde lock
desabilita e unlock
habilita interrupções. Mas, mesmo assim, isso pode não ser seguro para thread em uma arquitetura que tem mais de uma dessas CPUs compartilhando memória (o lock
pode desabilitar interrupções para apenas uma CPU).
A linguagem em si (ou bibliotecas para ela, se não estiver embutida na linguagem) fornecerá construções thread-safe e você deve usá-las ao invés de depender de seu entendimento (ou possivelmente mal-entendido) de qual código de máquina será gerado.
Coisas como Java synchronized
e pthread_mutex_lock()
(disponível para C / C ++ em alguns sistemas operacionais) são o que você precisa examinar (a) .
(a) Esta pergunta foi feita antes que os padrões C11 e C ++ 11 fossem concluídos. Essas iterações agora introduziram suporte de threading nas especificações da linguagem, incluindo tipos de dados atômicos (embora eles, e os threads em geral, sejam opcionais, pelo menos em C).