문제

이 스레드가 안전합니까?

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) 수면을보다 반응적인 대기 시간으로 만들 수 있습니다. 여기서 중지 요청이 더 빨리 처리됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top