이 스레드가 안전합니까?
-
07-07-2019 - |
문제
이 스레드가 안전합니까?
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;
}
}
해결책
값 유형을 잠그려고하기 때문에 컴파일되지 않습니다.
참조 유형의 별도 잠금 변수를 소개합니다.
private static readonly object padlock = new object();
그 외에 :
만약에 StopBrowserCleaning()
거기에있는 동안 호출됩니다 ~이다 청소 실 (잠자는 동안)이지만 StartBrowserCleaning()
첫 번째 스레드가 종료하려는 것을 알기 전에 다시 호출되면 두 개의 스레드가 끝납니다.
"청소 나사산이있는 것"과 "실제로 청소 실이 있습니다"라는 두 가지 변수를 고려할 수 있습니다.
또한 모니터를 사용하는 경우 Wait/Pulse
, 또는 EventHandle
(예 : ManualResetEvent
) 수면을보다 반응적인 대기 시간으로 만들 수 있습니다. 여기서 중지 요청이 더 빨리 처리됩니다.
제휴하지 않습니다 StackOverflow