ความแตกต่างระหว่างการทำงานของอะตอมและความปลอดภัยของเธรดหรือไม่


10

จากการสนทนาที่ฉันได้เห็นดูเหมือนว่าการทำงานของปรมาณูและความปลอดภัยของเธรดนั้นเป็นสิ่งเดียวกัน แต่ผู้คนมากมายบอกว่าพวกเขาต่างกัน มีใครบอกความแตกต่างได้ไหมถ้ามี


4
การปฏิบัติการปรมาณูจะช่วยสร้างความมั่นใจในความปลอดภัยของเธรด แต่อาจเป็นเช่นเดียวกันได้อย่างไร "เธรด" ไม่เหมือนกับการดำเนินการ ""
user50849

คำตอบ:


11

การดำเนินการของอะตอมเป็นวิธีที่จะทำให้เกิดความปลอดภัยของเธรดอย่างใดอย่างหนึ่งโดยใช้การล็อกบางชนิดเช่นMutexesหรือSemaphoresซึ่งใช้การดำเนินการของอะตอมภายในหรือโดยการใช้การซิงโครไนซ์ล็อคฟรีโดยใช้ atomics และรั้วหน่วยความจำ

ดังนั้นการดำเนินการปรมาณูเกี่ยวกับชนิดข้อมูลดั้งเดิมจึงเป็นเครื่องมือในการบรรลุความปลอดภัยของเธรด แต่ไม่รับประกันความปลอดภัยของเธรดโดยอัตโนมัติเนื่องจากคุณมีการดำเนินการหลายอย่างที่พึ่งพากัน คุณต้องตรวจสอบให้แน่ใจว่าการดำเนินการเหล่านี้ทำได้โดยไม่หยุดชะงักเช่นใช้ Mutexes

ใช่การเขียนหนึ่งในประเภทข้อมูลอะตอมมิกเหล่านี้ใน c # คือ thread safe แต่ไม่ได้ทำให้ฟังก์ชั่นที่คุณใช้ใน thread safe ซึ่งจะทำให้แน่ใจว่าการเขียนครั้งเดียวจะดำเนินการอย่างถูกต้องแม้ว่าเธรดที่สองจะเข้าถึง "ในเวลาเดียวกัน" ไม่น้อยกว่าการอ่านครั้งถัดไปจากเธรดปัจจุบันจะไม่ทำให้มั่นใจได้ว่าจะได้รับค่าที่เขียนไว้ก่อนหน้านี้เนื่องจากเธรดอื่นอาจเขียนลงไปเท่านั้นค่าที่อ่านนั้นจะถูกต้อง


int, บูล, ลอยเป็นด้ายปลอดภัยหรืออะตอม?
user960567

1
@ user960567 - ประเภทข้อมูลเป็นเพียง: ประเภทข้อมูล มันขึ้นอยู่กับคอมไพเลอร์ที่จะตัดสินใจว่าจะเข้าถึงมันอย่างไร ลองนึกถึง int64 บน 8086 CPU
mouviciel

2
ใน C # โดยเฉพาะคำถามที่ติดแท็กด้วยการอ่านและเขียนจะต้องเป็นอะตอมมิกในประเภทข้อมูลพื้นฐาน ดูEcma 334
user50849

2
และใช่การเขียนหนึ่งในประเภทข้อมูลอะตอมมิกเหล่านี้ใน c # คือ thread safe แต่ไม่ได้ทำให้ฟังก์ชั่นที่คุณใช้ใน thread safe ซึ่งจะทำให้แน่ใจว่าการเขียนครั้งเดียวจะดำเนินการอย่างถูกต้องแม้ว่าเธรดที่สองจะเข้าถึง "ในเวลาเดียวกัน" ไม่น้อยกว่าการอ่านครั้งถัดไปจากเธรดปัจจุบันจะไม่ทำให้มั่นใจได้ว่าจะได้รับค่าที่เขียนไว้ก่อนหน้านี้เนื่องจากเธรดอื่นอาจเขียนลงไปเท่านั้นค่าที่อ่านนั้นจะถูกต้อง
Archy

4
x = 5 คืออะตอมใน c # แต่ทันทีหลังจากการดำเนินการนี้มันอาจถูกเขียนทับ x = x + 1 ดำเนินการโดย 1. การโหลด x เข้าสู่ register 2 การเพิ่ม x ใน register 3 เก็บ x ลงในหน่วยความจำ หากเธรดที่สองทำสิ่งเดียวกันในเวลาเดียวกันทั้งสองจะโหลดค่าเดียวกันเพิ่มขึ้นและเก็บไว้ส่งผลให้ x เพิ่มขึ้นเพียงครั้งเดียวแทนที่จะเป็นสองครั้ง InterlockedIncrement ใช้คำสั่งตัวประมวลผลพิเศษเพื่อดำเนินการเพิ่มขึ้นของอะตอมหรือทำให้แน่ใจว่าสิ่งนี้โดยใช้กลไกการล็อคเช่น CAS เพื่อให้แน่ใจว่าในขณะที่ค่าใหม่ไม่ได้เขียนไม่มีเธรดอื่นอาจอ่านค่าเก่า
Archy

3

Atomicity และ thread-safety เป็นสองสิ่งที่แตกต่างกัน Atomicity หมายถึงคุณภาพ "ทั้งหมดหรือไม่มีอะไร" ของการดำเนินการ หากการดำเนินการไม่สามารถดำเนินการได้สำเร็จ 100% ระบบควรจะอยู่ในสถานะโดยรวมที่เคยทำมาก่อนที่การดำเนินการส่วนใดส่วนหนึ่งจะเริ่มต้นขึ้น ตัวอย่างคลาสสิกคือธุรกรรมฐานข้อมูล เมื่อบันทึกใบแจ้งหนี้รวมถึงส่วนหัวและรายการโฆษณาหลายรายการทุกส่วนของแถวฐานข้อมูลทุกแถวจะต้องจัดวางให้เรียบร้อย หากไม่มีข้อมูลสูญหายหรือเสียหาย หากไม่สามารถแทรกรายการโฆษณาไม่ควรแทรกแถวอื่น ๆ ที่เหลือเท่านั้น แต่ไม่มีแถวใดที่ประมวลผลแล้วที่เหลืออยู่

ความปลอดภัยของเธรดหมายถึงการรวมกันของสิ่งต่าง ๆ รวมถึงปรมาณูที่ช่วยให้การดำเนินการเป็น "reentrant"; ผู้ปฏิบัติงานหลายคนสามารถทำการดำเนินการเดียวกันเริ่มต้นในเวลาเดียวกันหรือแตกต่างกันโดยไม่มีผลกับคนอื่น ๆ มีหลายรุ่นสำหรับการทำงานแบบปลอดภัยต่อเธรด ส่วนใหญ่ของพวกเขาต้มลง conceptually เพื่อทำงานหลายขนานในการแยกสมบูรณ์ (คนงานสองคนสามารถทำงานเดียวกันในวัตถุที่แตกต่างกันสองหรือคอลเลกชันของวัตถุโดยไม่เคยรู้ว่าคนงานอื่นยังคงอยู่) หรือตั้ง "ท่อ" ภายใน ผู้ปฏิบัติงานหลายคนแต่ละคนทำภารกิจเดียวจากการดำเนินการทั้งหมด (คนงานแต่ละคนดำเนินต่อจากงานแรกไปยังงานต่อไปเรื่อย ๆ หรือมุ่งเน้นที่งานหนึ่งและมอบหมาย "ผลิตภัณฑ์ทำงาน" ขั้นกลางให้กับพนักงานคนต่อไป)


2

การปฏิบัติการแบบอะตอมมิกเป็นการดำเนินการที่ไม่สามารถถูกขัดจังหวะได้

เธรดที่ปลอดภัยคือเธรดที่สามารถถูกขัดจังหวะได้อย่างปลอดภัย

ความปลอดภัยของเธรดได้มาจากการทำงานของอะตอมโดยเฉพาะอย่างยิ่งในตรรกะที่ป้องกันไม่ให้มีการเข้าถึงทรัพยากรที่สำคัญหลายครั้ง

การดำเนินการปรมาณูขั้นพื้นฐานคือการทดสอบและตั้งค่าซึ่งใช้สำหรับการนำเซมาฟอร์ไปใช้งานซึ่งจะถูกใช้เพื่อสร้างความปลอดภัยของเธรด


การดำเนินการแบบหลายขั้นตอนไม่สามารถถูกขัดจังหวะและถูกเรียกว่ายังคงเป็นอะตอมได้หรือไม่ถ้ามันรับประกันว่าจะย้อนกลับไปมันเป็นการเปลี่ยนแปลงหรือไม่?
user50849

1
เลขที่อะตอมจะต้องเข้าใจในความหมายของนิรุกติศาสตร์: atomομος, atomos, แบ่งแยก
mouviciel

int, บูล, ลอยเป็นด้ายปลอดภัยหรืออะตอม?
user960567

แต่ไม่ได้มีความแตกต่างระหว่างการเป็น indivisble และปรากฏแบ่งแยกไปสังเกตการณ์ ? ตามคำจำกัดความของคุณการดำเนินการแบบไม่ใช้อะตอมอาจมีมากกว่าหนึ่งขั้นตอน ฉันเชื่อว่าคำว่า "ปรากฏ" ในคำจำกัดความของวิกิพีเดียเกี่ยวกับการปฏิบัติการปรมาณูเป็นสิ่งสำคัญ (ฉันอยู่ในการแชทถ้าใครต้องการนำมันมาที่นั่น) :)
user50849

มีความแตกต่างใหญ่อย่างหนึ่ง: ด้ายปลอดภัยสามารถถูกขัดจังหวะและไม่มีการรับประกันเวลาเท่าไหร่ นี่เป็นสิ่งสำคัญในการคำนวณแบบเรียลไทม์ การดำเนินการปรมาณู (ที่มีการล็อคอินเทอร์รัปต์หากเป็นแบบหลายขั้นตอน) รับประกันว่าจะยุติหลังจากเวลาที่คาดการณ์ไว้
mouviciel

1

ความปลอดภัยของเธรดนั้นเป็นกรอบหรือแนวคิดมากกว่าการดำเนินงานปรมาณูเป็นส่วนย่อยซึ่งหมายถึง (หนึ่งในหลาย ๆ ) ของการบรรลุสถานะว่าเป็นประเภทที่ปลอดภัยของเธรด

ความปลอดภัยของเธรดหมายถึงกระบวนการที่สามารถเข้าถึงได้โดยเธรดที่แยกต่างหากซึ่งการเข้าถึงหนึ่ง (และการจัดการข้อมูล) จะไม่ทำลายความสมบูรณ์ของการดำเนินการของผู้อื่น

ทักษะส่วนใหญ่ของโปรแกรมเมอร์คือการรู้วิธีการบรรลุเป้าหมายนี้ขึ้นอยู่กับสถานการณ์และวัตถุประสงค์หลักคุณอาจต้องดำเนินการเช่นล็อค, เซมาฟอร์, แลป, แลตช์, อะตอมมิกวัตถุ, กฎการซิงโครไนซ์ ฯลฯ ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.