Ви чули неправильно Цілком може бути, що "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 ++ в деяких операційних системах) - це те, що вам потрібно вивчити (а) .
(а) Це питання було задано до того, як були завершені стандарти С11 та С ++ 11. Зараз ці ітерації запровадили підтримку потоків у мовних специфікаціях, включаючи атомарні типи даних (хоча вони, і потоки загалом, є необов’язковими, принаймні в C).