Anda salah dengar. Ini mungkin "i++"
thread-safe untuk kompiler tertentu dan arsitektur prosesor tertentu tetapi tidak diamanatkan dalam standar sama sekali. Faktanya, karena multi-threading bukan bagian dari standar ISO C atau C ++ (a) , Anda tidak dapat menganggap apa pun sebagai thread-safe berdasarkan apa yang menurut Anda akan dikompilasi.
Sangat layak jika ++i
dapat dikompilasi ke urutan arbitrer seperti:
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
yang tidak akan aman untuk thread pada CPU (imajiner) saya yang tidak memiliki instruksi penambahan memori. Atau mungkin pintar dan menyusunnya menjadi:
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)
di mana lock
menonaktifkan dan unlock
mengaktifkan interupsi. Namun, meskipun demikian, ini mungkin tidak aman untuk thread dalam arsitektur yang memiliki lebih dari satu CPU yang berbagi memori (yang lock
hanya dapat menonaktifkan interupsi untuk satu CPU).
Bahasa itu sendiri (atau pustaka untuk itu, jika tidak dibangun ke dalam bahasa) akan menyediakan konstruksi yang aman untuk thread dan Anda harus menggunakannya daripada bergantung pada pemahaman Anda (atau mungkin kesalahpahaman) tentang kode mesin apa yang akan dihasilkan.
Hal-hal seperti Java synchronized
dan pthread_mutex_lock()
(tersedia untuk C / C ++ pada beberapa sistem operasi) adalah apa yang perlu Anda perhatikan (a) .
(a) Pertanyaan ini ditanyakan sebelum standar C11 dan C ++ 11 diselesaikan. Iterasi tersebut sekarang telah memperkenalkan dukungan threading ke dalam spesifikasi bahasa, termasuk tipe data atom (meskipun mereka, dan utas secara umum, bersifat opsional, setidaknya dalam C).