3 回答

TA貢獻1772條經驗 獲得超5個贊
代碼比那個舊 - 我在.NET 2.0問世之前寫了一段時間。該概念生產者/消費者隊列的方式相比,雖然舊的:)
是的,就我所知,該代碼是安全的 - 但它有一些不足之處:
它不是通用的?,F代版本肯定是通用的。
它無法阻止隊列。停止隊列的一種簡單方法(使所有消費者線程退出)是具有可以放入隊列的“停止工作”令牌。然后,您可以添加與線程一樣多的令牌。或者,您有一個單獨的標志,表示您要停止。(這允許其他線程在完成隊列中的所有當前工作之前停止。)
如果工作量很小,一次只能完成一項工作可能不是最有效的工作。
誠實地說,代碼背后的想法比代碼本身更重要。

TA貢獻1874條經驗 獲得超12個贊
如果您閱讀評論,您將理解我的答案是錯誤的:)
您的代碼中可能存在死鎖。
想象一下以下情況,為清楚起見,我使用單線程方法,但應該很容易轉換為多線程與睡眠:
// We create some actions...
object locker = new object();
Action action1 = () => {
lock (locker)
{
System.Threading.Monitor.Wait(locker);
Console.WriteLine("This is action1");
}
};
Action action2 = () => {
lock (locker)
{
System.Threading.Monitor.Wait(locker);
Console.WriteLine("This is action2");
}
};
// ... (stuff happens, etc.)
// Imagine both actions were running
// and there's 0 items in the queue
// And now the producer kicks in...
lock (locker)
{
// This would add a job to the queue
Console.WriteLine("Pulse now!");
System.Threading.Monitor.Pulse(locker);
}
// ... (more stuff)
// and the actions finish now!
Console.WriteLine("Consume action!");
action1(); // Oops... they're locked...
action2();
如果這沒有任何意義,請告訴我。
如果確認了這一點,那么您的問題的答案是“不,這不安全”;)我希望這會有所幫助。
- 3 回答
- 0 關注
- 970 瀏覽
添加回答
舉報