2010-08-11 45 views
2

高度存在這個鎖的問題,但我不明白這是什麼。我有強烈的懷疑,下面的例子沒有足夠好的鎖定。那麼會有什麼問題?這把鎖是什麼問題?

class example 
{ 
    object locker = new object(); 
    void start() 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      (new Thread(dostuff)).Start(); 
     } 
    } 
    void dostuff() 
    { 
     lock (locker) 
     { 
      //dosomething 
     } 
    } 
} 
+2

你需要多解釋一下你正在嘗試做什麼以及爲什麼這沒有達到你的期望。對於其中一個,你是否希望所有1000個線程都在同一個對象上運行(這對於1000個線程來說可能沒有意義),還是它們應該在可能不同的對象上運行? – 2010-08-11 20:52:35

+0

在同一個對象上工作的線程 – Freshblood 2010-08-11 20:55:45

+0

爲什麼問題投票結束? – Freshblood 2010-08-11 21:03:49

回答

3

您的代碼創建1000個線程。這非常昂貴,需要超過1 GB的內存。

然後所有這些線程競爭一個鎖,實質上是對整個操作進行序列化(去線程化)。

但是你的工作正常,沒有錯。這只是當你運行這個應用程序它可能看起來像你的電腦崩潰。


另請注意,您嘗試保護的對象應與綁定對象一對一綁定。

但是爲了得到更好的答案,您必須發佈更完整一點,也許更接近真實的代碼。

+0

它沒有任何意義,但仍然檢查是什麼導致了奇怪的結果 – Freshblood 2010-08-11 21:07:37

+0

我不確定在哪裏收集這需要超過1 GB的內存。它只有1,000個線程,所以你假設他每個線程至少獲得1.02 MB? – 2010-08-11 21:08:59

+0

@Gary:這是默認的堆棧大小。 – 2010-08-11 21:11:32

4

看起來你正在旋轉1000個線程,然後鎖定每個線程。這意味着dostuff中的代碼(位於鎖定部分)將按順序執行,而不是同時執行。

正如所寫的,直接在for循環中調用dostuff()會更高效。

+0

這只是一個例子來證明我的特殊問題。它已經預期鎖定,但我的應用程序顯示鎖定不起作用,所以我得到意想不到的結果。 – Freshblood 2010-08-11 20:43:31

+2

那麼你的應用程序向你展示了什麼,表明該鎖不起作用? – RQDQ 2010-08-11 20:46:03

+0

我不想告訴我的代碼有特定的一面,但我無法理解是什麼原因導致我的應用程序出現意外的結果。只有一個例子類的例子,所以書面代碼沒有問題吧? – Freshblood 2010-08-11 20:52:03

2

我不太確定你在做什麼,但是你的1000個線程將連續運行。首先擊敗線程的目的。

您的「dostuff」方法會立即鎖定線程運行的整個長度。線程然後解鎖,下一個線程可以開始處理(並鎖定...)

2

我不確定你的問題是什麼 - 此代碼將啓動dostuff 1000次,但鎖內的代碼一次只能執行一個。

您可能會遇到的唯一問題是,如果您需要一次只執行一個代碼,而不管您創建的示例類的副本數量多少。如果這很重要,那麼你需要使鎖櫃對象變爲靜態。