我有2个线程,一收一发
收线程速度很快,收到后直接入队列X,发线程先判断X.count是否大于0,然后从X队列dequeue头部一个元素发出去现在运行的时候,经常发现X队列dequeue出来的东西是null(已经保证enqueue不是null,而且队列长度大于0才会dequeue)还有的时候发现enqueue的时候提示数组长度不够查了一下好像是因为线程间协调出问题了,要用到什么lock free queue的技术才能解决,没太弄明白什么意思
收线程速度很快,收到后直接入队列X,发线程先判断X.count是否大于0,然后从X队列dequeue头部一个元素发出去现在运行的时候,经常发现X队列dequeue出来的东西是null(已经保证enqueue不是null,而且队列长度大于0才会dequeue)还有的时候发现enqueue的时候提示数组长度不够查了一下好像是因为线程间协调出问题了,要用到什么lock free queue的技术才能解决,没太弄明白什么意思
解决方案 »
- form.ShowDialog(owner)这里的owner是做什么用的?
- wpf中将 DynamicDataDisplay.dll 加载到References 什么意思啊
- 新手提问了,关于Dataset等等
- 如何用asp.net实现成批文件上传服务器
- 用OracleDataAdapter連接oracle 數據庫時, 測試連接表示成功,也能看到數據庫中的表, 但不能生成sql語句.求救!!!!!
- 请教一个问题,急!
- 怎么对DataGrid各列的宽度根据数据长短进行自动控制?!
- ArrayList实用问题
- 高分求助:oracle数据库中blob字段的问题
- vc#正式版什么时间出啊?
- 水晶报表直连数据库的问题
- VS2010怎么创建Windows forms control library项目
操作
Monitor.Exit(X);
thread producer
{
queueX.enqueue(item);
}thread consumer
{
if(queueX.count>0)
{
X = queueX.dequeue();
}
}就算是不同线程来操作也应该不会有冲突的地方啊?
等待状态,等接收线程处理完成后给发送线程发信号,让他处理刚刚收到的数据。
or2、用lock锁定队列对象
if(queueX.count>0)
{
线程1进到这里,上句queueX.count判断成功,此时线程1被CPU打断,执行线程2(也是取数据的),然后在执行线程1
X = queueX.dequeue();
}
线程2(也是取数据的)是consumer线程么?
我这里只有2个线程(1个producer,1个consumer)其中consumer是用while(true)的方式一直循环的
对于consumer而言,取数据应该肯定在判断if(queue.count>0)之后的