我的应用程序是一个多线程应用程序 . 我使用线程和任务来使用锁从~4队列中排队和出队 . 有时候,当我出队时,该项为空,当我查看队列内部时,我可以看到其他一些项也是空的(例如第5项为空) . 每当我入队时我总是创建一个新项目,所以它是null是不可能的 . 起初我以为另一个线程正在弄乱我的物品 . 但是当我看到第5项也是空的时候,而第3,第4和第2项并不是我意识到这是不可能的,因为你不能触及第5项而不是先前的项目 . 我无法分享我的代码 . 有人熟悉这种情况吗?可能是什么原因?
---------------------------------- EDIT --------------- --------------
排队队列的类继承自串口并排队如下:
if(BytesToRead>0)
{
byte[] data=new byte[BytesToRead];
Read(data,0,data.length)
MyClass c=new MyClass(){m_data=data, m_tod=DateTime.Now};
_dataQueue.Enqueue(c);
}
出列的课程各不相同,但想法类似:
lock(_sync)
{
var item=_dataQueue.dequeue();
}
当我出队时我得到了空 . 你可以看到我使用 DateTime.Now
所以它真的很奇怪,它变成了空 . 我的意思是如果一个线程使用这个,所以项目不应该在那里吗?每个使用该队列的类都有一个副本 . 在每个类中,大约有3个线程使用队列
1 回答
当从多个线程使用非线程安全的集合时,该推理不成立 . 种族状况可能导致各种症状 .
所以最好的办法是检查你的锁定情况 . 如果可能,发布代码的模型 .
----编辑后----:
你没有锁定Enqueue . 基本修复: