2009-09-14 2 views
4

이 스레드는 안전한가요?이 스레드는 안전한가요?

private static bool close_thread_running = false; 
public static void StartBrowserCleaning() 
{ 
    lock (close_thread_running) 
    { 
     if (close_thread_running) 
      return; 

     close_thread_running = true; 
    } 

    Thread thread = new Thread(new ThreadStart(delegate() 
    { 
     while (true) 
     { 
      lock (close_thread_running) 
      { 
       if (!close_thread_running) 
        break; 
      } 

      CleanBrowsers(); 

      Thread.Sleep(5000); 
     } 
    })); 

    thread.Start(); 
} 

public static void StopBrowserCleaning() 
{ 
    lock (close_thread_running) 
    { 
     close_thread_running = false; 
    } 
} 
+0

왜 내가 마라톤 맨이라고 생각하니? – Lunatik

답변

15

값 유형을 잠 그려하기 때문에 컴파일되지 않습니다.

참조 유형의 별도 잠금 변수를 도입하십시오. 그에서 제외

private static readonly object padlock = new object(); 

: (이 자고있는 동안) 가 청소 스레드가가있는 동안

StopBrowserCleaning() 경우라고합니다,하지만 StartBrowserCleaning()는 종료 의미있어 첫 번째 스레드 고지하기 전에 다시 호출 , 당신은 두 개의 스레드로 끝날 것입니다.

"클리닝 스레드가 될 것입니까?"와 "실제로 클리닝 스레드가 있습니까?"라는 두 개의 변수가 있다고 생각할 수 있습니다.

Wait/Pulse 또는 EventHandle과 같은 모니터를 사용하는 경우 (예 : ManualResetEvent) 잠자기 시간을보다 신속하게 처리 할 수 ​​있습니다. 잠자기 요청이 더 빨리 처리됩니다.

+12

컴파일하지 않는 무언가가 기술적으로 스레드 안전하다고 말하고 싶습니다. 결코 교착 상태가 아니거나 경쟁 조건을 만나지 않을 것입니다. –

+8

내 자동차가 절대로 날아갈 수 없기 때문에 공기가 안전하다는 것을 의미합니다. 공기 충돌? – icelava

+0

전에는 '공기 안전'에 대해 들어 본 적이 없었습니다. 왜 그럴까? 우주 여행에도 안전합니다. –