C#多线程

cor*_*ore 4 c# multithreading

看看下面的代码.假设这是整个类.我没有省略任何代码.这就是它的全部功能.

如果我在主程序循环中实例化这个类并不时调用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)会发生什么?

Mar*_*ell 8

简短版本是您必须同步对队列的访问,如果您希望它运行.Count/Dequeue中有明显的线程竞争,但更重要的是没有保证操作 - 内部状态可以合法地做任何事情,并且很可能被破坏.

您还需要一种最终退出线程的方法...

要编写阻塞队列,请参阅此处:在.NET中创建阻止Queue<T>.