Interlocked.Exchange
을 사용하여 일부 개체 초기화 기능을위한 스레드 안전 잠금 장치를 만들려고합니다. 아래 코드를 고려하십시오. 나는 if
이 while을 대체 할 때와 똑같이하고 싶습니다. 내가 물어 보는 이유는 코드가 계속 실행되면서 set
메시지 전에 종료 메시지를받을 때가 있다는 것입니다. 나는 출구에있는 국가가 항상 옳은 것처럼 보이기 때문에 이것은 단지 GUI 일이라는 것을 확인하고 싶다.잠금 장치로 잠금 해제 됨
class Program
{
private static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(() => InterlockedCheck("1")));
Thread thread2 = new Thread(new ThreadStart(() => InterlockedCheck("2")));
Thread thread3 = new Thread(new ThreadStart(() => InterlockedCheck("3")));
Thread thread4 = new Thread(new ThreadStart(() => InterlockedCheck("4")));
thread4.Start();
thread1.Start();
thread2.Start();
thread3.Start();
Console.ReadKey();
}
const int NOTCALLED = 0;
const int CALLED = 1;
static int _state = NOTCALLED;
//...
static void InterlockedCheck(string thread)
{
Console.WriteLine("Enter thread [{0}], state [{1}]", thread, _state);
//while (Interlocked.Exchange(ref _state, CALLED) == NOTCALLED)
if (Interlocked.Exchange(ref _state, CALLED) == NOTCALLED)
{
Console.WriteLine("Setting state on T[{0}], state[{1}]", thread, _state);
}
Console.WriteLine("Exit from thread [{0}] state[{1}]", thread, _state);
}
}
아마도'lock'을 두 번 확인해야합니다. – i3arnon
"'_state' 값을 두 번 확인한다고 가정합니다. 그리고이 구체적인 예에서 그렇게 할 필요는 없습니다. 잠금 장치의 요점은 "enter"및 "exit"메시지의 질서있는 실행을 보장하기 위해 _state 필드의 처리를 보호하는 것입니다. 이중 확인 된 구현은 후자를 수행 할 수 없습니다. 어쨌든, 이중 체크 잠금의 성능 향상은 코드의 복잡성 증가를 정당화하기에 충분하지 않습니다. –
"enter"및 "exit"메시지가 잠금 장치 안에있을 필요는 없습니다. 이러한 메시지를 중요 섹션의 일부로 만드는 것은 가치가 없습니다. 이중 검사는 알려진 패턴이며 패스트 경로의 성능을 향상시킵니다. 영업 이익이 '연동'운영 성과에 대해 묻는 것은 아마도 문제 일 것이라고 생각하십시오. 이중 검사가 너무 복잡한 경우 '지연 성'(빠른 경로에 최적화 됨)이 해당 작업을 수행합니다. – i3arnon