3 回答
TA贡献1772条经验 获得超5个赞
代码比那个旧 - 我在.NET 2.0问世之前写了一段时间。该概念生产者/消费者队列的方式相比,虽然旧的:)
是的,就我所知,该代码是安全的 - 但它有一些不足之处:
它不是通用的。现代版本肯定是通用的。
它无法阻止队列。停止队列的一种简单方法(使所有消费者线程退出)是具有可以放入队列的“停止工作”令牌。然后,您可以添加与线程一样多的令牌。或者,您有一个单独的标志,表示您要停止。(这允许其他线程在完成队列中的所有当前工作之前停止。)
如果工作量很小,一次只能完成一项工作可能不是最有效的工作。
诚实地说,代码背后的想法比代码本身更重要。
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 关注
- 940 浏览
添加回答
举报