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

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); สร้างคำเตือน "การอ้างอิงถึงเขตข้อมูลที่มีความผันผวนจะไม่ถือว่าเป็นความผันผวน" ฉันควรคิดอย่างไรเกี่ยวกับเรื่องนี้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.