[英]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
,有兩個問題:
你應該使用一個volatile static
成員。 易失性將告訴編譯器不要在優化中嘗試任何“聰明”的東西。
你寫過了所謂的“自旋鎖”。 在某些特殊情況下,這是最好的方法。 但通常這是一個可怕的想法,因為你的線程將消耗CPU直到設置working
變量。
還有另一個問題,如果多個線程可以看到工作(如另一個海報所提到的,它是一個局部變量),正如現在所寫,不能保證系統中的其他內核會看到更新以正確的順序工作。 需要一個內存屏障,例如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.