คุณเคยได้ยินผิด อาจเป็นไปได้ว่า"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
ซึ่งจะไม่ปลอดภัยต่อเธรดบน CPU (จินตภาพ) ของฉันที่ไม่มีคำแนะนำในการเพิ่มหน่วยความจำ หรืออาจจะฉลาดและรวบรวมเป็น:
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
อาจปิดใช้งานการขัดจังหวะสำหรับ CPU ตัวเดียวเท่านั้น)
ภาษาเอง (หรือไลบรารีสำหรับมันหากไม่ได้ติดตั้งไว้ในภาษา) จะให้โครงสร้างที่ปลอดภัยสำหรับเธรดและคุณควรใช้สิ่งเหล่านี้แทนที่จะขึ้นอยู่กับความเข้าใจของคุณ (หรืออาจเข้าใจผิด) ว่าจะสร้างรหัสเครื่องใด
สิ่งเช่น Java synchronized
และpthread_mutex_lock()
(สามารถใช้ได้กับ C / C ++ ภายใต้ระบบปฏิบัติการบางส่วน) เป็นสิ่งที่คุณต้องมองเข้าไปใน(ก)
(a)คำถามนี้ถูกถามก่อนที่มาตรฐาน C11 และ C ++ 11 จะเสร็จสมบูรณ์ ตอนนี้การทำซ้ำเหล่านั้นได้แนะนำการสนับสนุนเธรดในข้อกำหนดของภาษาซึ่งรวมถึงประเภทข้อมูลอะตอม (แม้ว่าโดยทั่วไปแล้วจะเป็นประเภทข้อมูลหรือเธรดหรือไม่ก็ได้ แต่อย่างน้อยก็ใน C)