簡體   English   中英

這對靜態類和線程安全來說是不好的做法嗎?

[英]Is this a bad practice with static classes and thread safety?

假設我沒有使用鎖定語句,這是一個不好的做法嗎?

public static class Foo
{
  public static string Bar()
  {
    bool working;

    while (working)
    {
      // Loop until ready to run.
    }

    working = true;

    // Do stuff here.

    working = false;
    return "done."
  }
}

編輯 -

在嘗試這樣的事情后,我意識到由於幾個原因這是不可行的。 我只是好奇..我發布的例子甚至都沒有用。

循環是一個CPU消耗過程。

我的意思是,如果你所做的一切都只是等待。 這不是一件好事。

首先,工作對方法是私有的,所以它不起作用。 調用它的2個線程將各自擁有自己的“工作”。 您需要將其設為靜態字段才能生效。

即便如此,你也可以獲得競爭條件。 2個線程可以同時命中,通過while(工作)條件,然后設置working = true; 並在同一時間做事。

使用鎖或信號量將有助於解決這個問題。

假設你的意思是從另一個線程修改working ,有兩個問題:

  1. 你應該使用一個volatile static成員。 易失性將告訴編譯器不要在優化中嘗試任何“聰明”的東西。

  2. 你寫過了所謂的“自旋鎖”。 在某些特殊情況下,這是最好的方法。 但通常這是一個可怕的想法,因為你的線程將消耗CPU直到設置working變量。

是的,這是不好的做法。

你為什么不使用lock語句? 看看Monitor類,我可以提供互斥和同步。

不應使用旋轉循環和非線程安全變量工作。

還有另一個問題,如果多個線程可以看到工作(如另一個海報所提到的,它是一個局部變量),正如現在所寫,不能保證系統中的其他內核會看到更新以正確的順序工作。 需要一個內存屏障,例如System.Threading.Thread.MemoryBarrier,以保證CPU不會通過“Do stuff here”重新排序寫入工作。

但是你應該考慮使用鎖而不是。 無鎖編程難以理解。

使用鎖定是防止並發問題的唯一方法(其他不做的事情)。

public static class Foo
{
  private static object barLock = new object();

  public static string Bar()
  {
    lock (barLock)
    {
      // Do work
      return "Done";
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM