0

我的应用程序是一个多线程应用程序。我使用线程和任务使用锁从〜4个队列中将项目入队和出队。有时,当我出队时,该项目为空,当我查看队列内部时,我可以看到其他一些项目也为空(例如,第 5 个项目为空)。每当我入队时,我总是创建一个新项目,所以它是 null 是不可能的。起初我以为另一个线程正在弄乱我的物品。但是当我看到第 5 项也是空的,而第 3、第 4 和第 2 项不是时,我意识到这是不可能的,因为在出​​列之前的项目之前你不能触摸第 5 项。我不能分享我的代码。有人熟悉这种情况吗?可能是什么原因?

----------------------------------编辑--------------- --------------
使队列入队的类继承自串行端口并像这样入队:

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 个线程使用队列

4

1 回答 1

0

这是不可能的,因为你不能在出列前一个项目之前触摸第 5 个项目。

当从多个线程使用非线程安全的集合时,这种推理不成立。种族状况会导致各种症状。

所以最好的办法是检查你的锁定。如果可能,请发布代码的模型。

----Edit---- 之后:

你没有锁定在 Enqueue 周围。基本修复:

//_dataQueue.Enqueue(c);
lock(_sync)
{
   _dataQueue.Enqueue(c);
}
于 2013-07-21T07:35:01.220 回答