Эта тема безопасна? - PullRequest
       13

Эта тема безопасна?

4 голосов
/ 14 сентября 2009

Безопасен ли этот поток?

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;
    }
}

1 Ответ

15 голосов
/ 14 сентября 2009

Ну, он даже не скомпилируется, потому что вы пытаетесь заблокировать тип значения.

Введите отдельную переменную блокировки ссылочного типа, например

private static readonly object padlock = new object();

Кроме этого:

Если StopBrowserCleaning() вызывается, когда является чистящим потоком (пока он спит), но затем StartBrowserCleaning() вызывается снова, прежде чем первый поток заметит, что он должен завершить работу, заканчиваются двумя нитями.

Возможно, вы захотите рассмотреть вопрос о наличии двух переменных: одна для «это должен быть поток очистки», а другая для «действительно ли есть поток очистки».

Кроме того, если вы используете монитор с Wait/Pulse или EventHandle (например, ManualResetEvent), вы можете сделать свой сон более реактивным временем ожидания, когда запрос на остановку будет обрабатываться быстрее.

...