คำถามติดแท็ก atomicity

4
การกำหนดค่าอ้างอิงเป็นแบบอะตอมเหตุใดจึงจำเป็นต้องมี Interlocked.Exchange (ref Object, Object)?
ในบริการเว็บ asmx แบบมัลติเธรดของฉันฉันมีฟิลด์คลาส _allData ของประเภท SystemData ของฉันเองซึ่งประกอบด้วยไม่กี่รายการList<T>และDictionary<T>ทำเครื่องหมายเป็นvolatile. ข้อมูลระบบ ( _allData) ถูกรีเฟรชเป็นครั้งคราวและฉันทำได้โดยการสร้างออบเจ็กต์อื่นที่เรียกว่าnewDataและเติมโครงสร้างข้อมูลด้วยข้อมูลใหม่ เมื่อเสร็จแล้วฉันก็มอบหมาย private static volatile SystemData _allData public static bool LoadAllSystemData() { SystemData newData = new SystemData(); /* fill newData with up-to-date data*/ ... _allData = newData. } สิ่งนี้ควรใช้งานได้เนื่องจากการกำหนดเป็นแบบปรมาณูและเธรดที่มีการอ้างอิงถึงข้อมูลเก่ายังคงใช้งานต่อไปและส่วนที่เหลือจะมีข้อมูลระบบใหม่หลังการมอบหมาย แต่คนสอนฉันบอกว่าแทนการใช้volatileคำหลักและมอบหมายง่ายฉันควรใช้InterLocked.Exchangeเพราะเขาบอกว่าบนแพลตฟอร์มบางคนก็ไม่ได้รับประกันว่าได้รับมอบหมายอ้างอิงอะตอม ยิ่งไปกว่านั้น: เมื่อฉันประกาศthe _allDataฟิลด์เป็นvolatileไฟล์ Interlocked.Exchange<SystemData>(ref _allData, newData); สร้างคำเตือน "การอ้างอิงถึงเขตข้อมูลที่มีความผันผวนจะไม่ถือว่าเป็นความผันผวน" ฉันควรคิดอย่างไรเกี่ยวกับเรื่องนี้

4
ไฟล์ต่อท้าย atomic ใน UNIX หรือไม่
โดยทั่วไปแล้วเราจะรับอะไรได้บ้างเมื่อเราผนวกเข้ากับไฟล์ใน UNIX จากกระบวนการต่างๆ เป็นไปได้ไหมที่จะสูญเสียข้อมูล (กระบวนการหนึ่งเขียนทับการเปลี่ยนแปลงของอีกฝ่าย)? เป็นไปได้ไหมที่ข้อมูลจะแหลกเหลว? (ตัวอย่างเช่นแต่ละกระบวนการต่อท้ายหนึ่งบรรทัดต่อการผนวกเข้ากับไฟล์บันทึกเป็นไปได้หรือไม่ที่สองบรรทัดจะยุ่งเหยิง) หากภาคผนวกไม่ใช่อะตอมตามความหมายข้างต้นวิธีใดที่ดีที่สุดในการรับประกันการยกเว้นซึ่งกันและกัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.