C#中queue的问题

shanyang1 2011-05-01 08:31:07
我有2个线程,一收一发
收线程速度很快,收到后直接入队列X,发线程先判断X.count是否大于0,然后从X队列dequeue头部一个元素发出去

现在运行的时候,经常发现X队列dequeue出来的东西是null(已经保证enqueue不是null,而且队列长度大于0才会dequeue)

还有的时候发现enqueue的时候提示数组长度不够

查了一下好像是因为线程间协调出问题了,要用到什么lock free queue的技术才能解决,没太弄明白什么意思

...全文
566 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongxinjian_1989 2012-09-19
  • 打赏
  • 举报
回复
不是很东 学习中
shanyang1 2011-05-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lcl_data 的回复:]
if(queueX.count>0)
{
线程1进到这里,上句queueX.count判断成功,此时线程1被CPU打断,执行线程2(也是取数据的),然后在执行线程1
X = queueX.dequeue();
}
[/Quote]

线程2(也是取数据的)是consumer线程么?
我这里只有2个线程(1个producer,1个consumer)其中consumer是用while(true)的方式一直循环的
对于consumer而言,取数据应该肯定在判断if(queue.count>0)之后的

十八道胡同 2011-05-01
  • 打赏
  • 举报
回复

if(queueX.count>0)
{
线程1进到这里,上句queueX.count判断成功,此时线程1被CPU打断,执行线程2(也是取数据的),然后在执行线程1
X = queueX.dequeue();
}
shanyang1 2011-05-01
  • 打赏
  • 举报
回复
为何明明queue.count>0的情况下dequeue出来还有null的东西?

CShareMySide 2011-05-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 inso2010 的回复:]
Monitor.Enter(X);

操作

Monitor.Exit(X);
[/Quote]
+1
isjoe 2011-05-01
  • 打赏
  • 举报
回复
1、使用AutoResetEvent 或其他线程同步类,在接收线程接收到数据且放入队列之前,让发送线程处于
等待状态,等接收线程处理完成后给发送线程发信号,让他处理刚刚收到的数据。
or

2、用lock锁定队列对象
十八道胡同 2011-05-01
  • 打赏
  • 举报
回复
看来没仔细学习操作系统,建议你先看下典型的生产者-消费者算法。
shanyang1 2011-05-01
  • 打赏
  • 举报
回复
有必要lock么
thread producer
{
queueX.enqueue(item);
}

thread consumer
{
if(queueX.count>0)
{
X = queueX.dequeue();
}
}

就算是不同线程来操作也应该不会有冲突的地方啊?
十八道胡同 2011-05-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]

典型的生产者-消费者算法。
[/Quote]
支持

需要lock住公用的部分,lock的意思就是说只能有一个线程加或者取,这样就可以保证操作都有效
inso2010 2011-05-01
  • 打赏
  • 举报
回复
Monitor.Enter(X);

操作

Monitor.Exit(X);
threenewbee 2011-05-01
  • 打赏
  • 举报
回复
典型的生产者-消费者算法。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧