Yanlış duydun. İyi olabilir "i++"
, belirli bir derleyici ve belirli işlemci mimarisi için evreli ama hiç standartlarda zorunlu değil. Aslında, çoklu iş parçacığı ISO C veya C ++ standartlarının (a) bir parçası olmadığından, derleneceğini düşündüğünüz şeye dayanarak hiçbir şeyin iş parçacığı açısından güvenli olduğunu düşünemezsiniz.
Aşağıdakiler ++i
gibi gelişigüzel bir sıraya göre derlemek oldukça mümkündür :
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
bu, bellek artırma talimatları olmayan (hayali) CPU'mda iş parçacığı açısından güvenli olmazdı. Veya akıllı olabilir ve onu şu şekilde derleyebilir:
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)
nerede lock
devre dışı bırakır ve unlock
kesmeleri mümkün kılar. Ancak, o zaman bile, belleği paylaşan bu CPU'lardan birden fazlasına sahip bir mimaride bu, iş parçacığı açısından güvenli lock
olmayabilir (yalnızca bir CPU için kesintileri devre dışı bırakabilir).
Dilin kendisi (veya dilde yerleşik değilse bunun için kitaplıklar) iş parçacığı güvenli yapılar sağlayacaktır ve bunları hangi makine kodunun üretileceğini anlamanıza (veya muhtemelen yanlış anlamanıza) bağlı olmak yerine kullanmalısınız.
Java synchronized
ve pthread_mutex_lock()
(bazı işletim sistemlerinde C / C ++ için mevcuttur) gibi şeyler, (a) ' ya bakmanız gereken şeylerdir .
(a) Bu soru, C11 ve C ++ 11 standartları tamamlanmadan önce sorulmuştur. Bu yinelemeler, atomik veri türleri de dahil olmak üzere dil spesifikasyonlarına iş parçacığı desteği getirmiştir (ancak bunlar ve genel olarak iş parçacıkları en azından C'de isteğe bağlıdır ).