จากการสนทนาที่ฉันได้เห็นดูเหมือนว่าการทำงานของปรมาณูและความปลอดภัยของเธรดนั้นเป็นสิ่งเดียวกัน แต่ผู้คนมากมายบอกว่าพวกเขาต่างกัน มีใครบอกความแตกต่างได้ไหมถ้ามี
จากการสนทนาที่ฉันได้เห็นดูเหมือนว่าการทำงานของปรมาณูและความปลอดภัยของเธรดนั้นเป็นสิ่งเดียวกัน แต่ผู้คนมากมายบอกว่าพวกเขาต่างกัน มีใครบอกความแตกต่างได้ไหมถ้ามี
คำตอบ:
การดำเนินการของอะตอมเป็นวิธีที่จะทำให้เกิดความปลอดภัยของเธรดอย่างใดอย่างหนึ่งโดยใช้การล็อกบางชนิดเช่นMutexesหรือSemaphoresซึ่งใช้การดำเนินการของอะตอมภายในหรือโดยการใช้การซิงโครไนซ์ล็อคฟรีโดยใช้ atomics และรั้วหน่วยความจำ
ดังนั้นการดำเนินการปรมาณูเกี่ยวกับชนิดข้อมูลดั้งเดิมจึงเป็นเครื่องมือในการบรรลุความปลอดภัยของเธรด แต่ไม่รับประกันความปลอดภัยของเธรดโดยอัตโนมัติเนื่องจากคุณมีการดำเนินการหลายอย่างที่พึ่งพากัน คุณต้องตรวจสอบให้แน่ใจว่าการดำเนินการเหล่านี้ทำได้โดยไม่หยุดชะงักเช่นใช้ Mutexes
ใช่การเขียนหนึ่งในประเภทข้อมูลอะตอมมิกเหล่านี้ใน c # คือ thread safe แต่ไม่ได้ทำให้ฟังก์ชั่นที่คุณใช้ใน thread safe ซึ่งจะทำให้แน่ใจว่าการเขียนครั้งเดียวจะดำเนินการอย่างถูกต้องแม้ว่าเธรดที่สองจะเข้าถึง "ในเวลาเดียวกัน" ไม่น้อยกว่าการอ่านครั้งถัดไปจากเธรดปัจจุบันจะไม่ทำให้มั่นใจได้ว่าจะได้รับค่าที่เขียนไว้ก่อนหน้านี้เนื่องจากเธรดอื่นอาจเขียนลงไปเท่านั้นค่าที่อ่านนั้นจะถูกต้อง
Atomicity และ thread-safety เป็นสองสิ่งที่แตกต่างกัน Atomicity หมายถึงคุณภาพ "ทั้งหมดหรือไม่มีอะไร" ของการดำเนินการ หากการดำเนินการไม่สามารถดำเนินการได้สำเร็จ 100% ระบบควรจะอยู่ในสถานะโดยรวมที่เคยทำมาก่อนที่การดำเนินการส่วนใดส่วนหนึ่งจะเริ่มต้นขึ้น ตัวอย่างคลาสสิกคือธุรกรรมฐานข้อมูล เมื่อบันทึกใบแจ้งหนี้รวมถึงส่วนหัวและรายการโฆษณาหลายรายการทุกส่วนของแถวฐานข้อมูลทุกแถวจะต้องจัดวางให้เรียบร้อย หากไม่มีข้อมูลสูญหายหรือเสียหาย หากไม่สามารถแทรกรายการโฆษณาไม่ควรแทรกแถวอื่น ๆ ที่เหลือเท่านั้น แต่ไม่มีแถวใดที่ประมวลผลแล้วที่เหลืออยู่
ความปลอดภัยของเธรดหมายถึงการรวมกันของสิ่งต่าง ๆ รวมถึงปรมาณูที่ช่วยให้การดำเนินการเป็น "reentrant"; ผู้ปฏิบัติงานหลายคนสามารถทำการดำเนินการเดียวกันเริ่มต้นในเวลาเดียวกันหรือแตกต่างกันโดยไม่มีผลกับคนอื่น ๆ มีหลายรุ่นสำหรับการทำงานแบบปลอดภัยต่อเธรด ส่วนใหญ่ของพวกเขาต้มลง conceptually เพื่อทำงานหลายขนานในการแยกสมบูรณ์ (คนงานสองคนสามารถทำงานเดียวกันในวัตถุที่แตกต่างกันสองหรือคอลเลกชันของวัตถุโดยไม่เคยรู้ว่าคนงานอื่นยังคงอยู่) หรือตั้ง "ท่อ" ภายใน ผู้ปฏิบัติงานหลายคนแต่ละคนทำภารกิจเดียวจากการดำเนินการทั้งหมด (คนงานแต่ละคนดำเนินต่อจากงานแรกไปยังงานต่อไปเรื่อย ๆ หรือมุ่งเน้นที่งานหนึ่งและมอบหมาย "ผลิตภัณฑ์ทำงาน" ขั้นกลางให้กับพนักงานคนต่อไป)
การปฏิบัติการแบบอะตอมมิกเป็นการดำเนินการที่ไม่สามารถถูกขัดจังหวะได้
เธรดที่ปลอดภัยคือเธรดที่สามารถถูกขัดจังหวะได้อย่างปลอดภัย
ความปลอดภัยของเธรดได้มาจากการทำงานของอะตอมโดยเฉพาะอย่างยิ่งในตรรกะที่ป้องกันไม่ให้มีการเข้าถึงทรัพยากรที่สำคัญหลายครั้ง
การดำเนินการปรมาณูขั้นพื้นฐานคือการทดสอบและตั้งค่าซึ่งใช้สำหรับการนำเซมาฟอร์ไปใช้งานซึ่งจะถูกใช้เพื่อสร้างความปลอดภัยของเธรด
ความปลอดภัยของเธรดนั้นเป็นกรอบหรือแนวคิดมากกว่าการดำเนินงานปรมาณูเป็นส่วนย่อยซึ่งหมายถึง (หนึ่งในหลาย ๆ ) ของการบรรลุสถานะว่าเป็นประเภทที่ปลอดภัยของเธรด
ความปลอดภัยของเธรดหมายถึงกระบวนการที่สามารถเข้าถึงได้โดยเธรดที่แยกต่างหากซึ่งการเข้าถึงหนึ่ง (และการจัดการข้อมูล) จะไม่ทำลายความสมบูรณ์ของการดำเนินการของผู้อื่น
ทักษะส่วนใหญ่ของโปรแกรมเมอร์คือการรู้วิธีการบรรลุเป้าหมายนี้ขึ้นอยู่กับสถานการณ์และวัตถุประสงค์หลักคุณอาจต้องดำเนินการเช่นล็อค, เซมาฟอร์, แลป, แลตช์, อะตอมมิกวัตถุ, กฎการซิงโครไนซ์ ฯลฯ ...