이 동작에 대한 집단적 이해에 대한 저의 공헌은 다음과 같습니다. 휘발성 구절의 동작을 비 휘발성 (즉, "정상") int 값과 나란히 표시하는 데모 (xkip 데모 기반)에 불과합니다. -side, 같은 프로그램에서 ...이 스레드를 발견했을 때 찾던 것입니다.
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로 시도한 모든 것에서 휘발성 여부에 관계없이 "올바르게"동작합니다 . 그리고 실제로 그럴 경우 왜 그런지 설명하고 싶습니다. 컴파일러는 레지스터의 정적 변수 값 을 캐시하지 않습니다 (즉, 대신 해당 힙 주소에 대한 참조를 캐시 함 )?
아니 이것은 지역 사회 stear하기위한 시도이다 ... 새로운 질문하지 않습니다 다시 원래의 질문을.