Вы слышали неправильно. Вполне возможно, что "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 ++ в некоторых операционных системах) - это то, что вам нужно изучить (a) .
(a) Этот вопрос задавался до того, как были завершены стандарты C11 и C ++ 11. В этих итерациях появилась поддержка потоков в спецификациях языка, включая атомарные типы данных (хотя они и потоки в целом необязательны, по крайней мере в C).