นี่คือการมีส่วนร่วมของฉันในการทำความเข้าใจพฤติกรรมนี้โดยรวม ... มันไม่มากเพียงแค่การสาธิต (จากการสาธิตของ xkip) ซึ่งแสดงให้เห็นถึงพฤติกรรมของโองการที่ผันผวนค่า int ที่ไม่ระเหย (เช่น "ปกติ") เคียงข้างกัน - ข้างในโปรแกรมเดียวกัน ... ซึ่งเป็นสิ่งที่ฉันกำลังมองหาเมื่อพบกระทู้นี้
using System;
using System.Threading;
namespace VolatileTest
{
class VolatileTest
{
private volatile int _volatileInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _volatileInt = 1; }).Start();
while ( _volatileInt != 1 )
;
Console.WriteLine("_volatileInt="+_volatileInt);
}
}
class NormalTest
{
private int _normalInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _normalInt = 1; }).Start();
while ( _normalInt != 1 )
;
Console.WriteLine("_normalInt="+_normalInt);
}
}
class Program
{
static void Main() {
#if DEBUG
Console.WriteLine("You must run this program in Release mode to reproduce the problem!");
#endif
new VolatileTest().Run();
Console.WriteLine("This program will now hang!");
new NormalTest().Run();
}
}
}
มีคำอธิบายสั้น ๆ ที่ยอดเยี่ยมจริงๆด้านบนรวมถึงข้อมูลอ้างอิงที่ยอดเยี่ยม ขอบคุณทุกคนที่ช่วยให้หัวของฉันvolatile
(อย่างน้อยก็พอที่จะรู้ว่าvolatile
สัญชาตญาณแรกของฉันอยู่ที่ไหนlock
)
ไชโยและขอบคุณสำหรับปลาทุกตัว คี ธ
PS:ฉันจะให้ความสนใจมากในการสาธิตของการร้องขอเดิมซึ่งเป็น "ผมต้องการที่จะเห็นคง int ระเหยพฤติกรรมอย่างถูกต้องที่คง intเกเร
ฉันได้ลองและล้มเหลวในการท้าทายนี้ (อันที่จริงฉันยอมแพ้อย่างรวดเร็ว ;-) ในทุกสิ่งที่ฉันลองใช้กับ vars คงที่พวกเขาทำงาน "ถูกต้อง" ไม่ว่าจะมีความผันผวนหรือไม่ก็ตาม... และฉันชอบคำอธิบายว่าทำไมถึงเป็นเช่นนั้นถ้าเป็นเช่นนั้นจริง ... เป็นเช่นนั้นหรือไม่ คอมไพเลอร์ไม่แคชค่าของตัวแปรแบบคงที่ในรีจิสเตอร์ (กล่าวคือแคชการอ้างอิงถึงฮีปแอดเดรสนั้นแทน)?
ไม่นี่ไม่ใช่คำถามใหม่ ... เป็นความพยายามที่จะดึงชุมชนกลับไปสู่คำถามเดิม