2009-09-14 7 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

Раньше я никогда не слышал об «безопасности воздуха», но, разумеется. Почему бы и нет? Это также безопасное пространство. –

Смежные вопросы