Вы ошиблись. Вполне может быть, что "i++"это потокобезопасный для конкретного компилятора и конкретной архитектуры процессора, но это вообще не предусмотрено стандартами. Фактически, поскольку многопоточность не является частью стандартов ISO C или C ++ (a) , вы не можете считать что-либо поточно-ориентированным, исходя из того, до чего, по вашему мнению, он будет компилироваться.
Вполне возможно, что ++iможно было бы скомпилировать произвольную последовательность, такую как:
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
что не было бы поточно-ориентированным на моем (воображаемом) процессоре, у которого нет инструкций по увеличению памяти. Или он может быть умным и скомпилировать его в:
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)
где lockотключает и unlockвключает прерывания. Но даже в этом случае это может быть небезопасным для потоков в архитектуре, в которой более одного из этих процессоров совместно используют память (они lockмогут отключать прерывания только для одного процессора).
Сам язык (или библиотеки для него, если он не встроен в язык) будет предоставлять потокобезопасные конструкции, и вы должны использовать их, а не зависеть от вашего понимания (или, возможно, непонимания) того, какой машинный код будет сгенерирован.
Такие вещи, как Java synchronizedи pthread_mutex_lock()(доступные для C / C ++ в некоторых операционных системах), это то, что вам нужно изучить (а) .
(а) Этот вопрос был задан до того, как были завершены стандарты C11 и C ++ 11. Эти итерации теперь включают поддержку потоковой передачи в спецификации языка, включая атомарные типы данных (хотя они и потоки в целом являются необязательными, по крайней мере, в C).