2009-09-14 84 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 2009-12-15 13:47:08

回答

15

那麼,它甚至不會編譯,因爲你試圖鎖定一個值類型。

引入引用類型的單獨鎖定變量,例如,

private static readonly object padlock = new object(); 

旁白:

如果StopBrowserCleaning()被稱爲雖然清洗線(雖然它睡覺),但隨後StartBrowserCleaning()的是,它的意思是關閉第一個線程通知之前再次呼籲,你最終會得到兩個線程。

您可能需要考慮有兩個變量 - 一個用於「是否意味着是清理線程」,另一個是「實際上是否有清理線程」。

另外,如果你使用一個監視器Wait/Pulse,或EventHandle(例如ManualResetEvent),你可以讓你的睡眠更活潑的等待時間,在哪裏停止的請求將被更迅速地處理。

+12

我想說一些不編譯的技術上是線程安全的 - 它永遠不會死鎖或遇到競賽條件:-) – 2009-09-14 06:04:10

+8

這是否意味着我的車是空氣安全的,因爲它永遠不會飛,因此永遠不會遇到一個mid-空中相撞? – icelava 2009-09-14 06:08:18

+0

我從來沒有聽說過「空氣安全」,但當然。爲什麼不呢?這也是太空旅行的安全。 – 2009-09-14 06:11:02