看看下面的代码.假设这是整个类.我没有省略任何代码.这就是它的全部功能.
如果我在主程序循环中实例化这个类并不时调用myExample.Add(无论如何),我是否需要担心因为没有锁定Dequeue()和Enqueue()而导致的任何问题?
public class Example<T>
{
private Queue<T> q = new Queue<T>();
public Example()
{
new Thread(() =>
{
while (true)
{
if (this.q.Count > 0)
{
var item = this.q.Dequeue();
}
Thread.Sleep(1);
}
}).Start();
}
public void Add(T val)
{
this.q.Enqueue(val);
}
}
Run Code Online (Sandbox Code Playgroud)
如果在this.q.Dequeue()的同时调用this.q.Enqueue(val)会发生什么?
简短版本是您必须同步对队列的访问,如果您希望它运行.Count/Dequeue中有明显的线程竞争,但更重要的是没有保证操作 - 内部状态可以合法地做任何事情,并且很可能被破坏.
您还需要一种最终退出线程的方法...
要编写阻塞队列,请参阅此处:在.NET中创建阻止Queue<T>.
| 归档时间: |
|
| 查看次数: |
1332 次 |
| 最近记录: |