我有2个线程,一收一发
收线程速度很快,收到后直接入队列X,发线程先判断X.count是否大于0,然后从X队列dequeue头部一个元素发出去现在运行的时候,经常发现X队列dequeue出来的东西是null(已经保证enqueue不是null,而且队列长度大于0才会dequeue)还有的时候发现enqueue的时候提示数组长度不够查了一下好像是因为线程间协调出问题了,要用到什么lock free queue的技术才能解决,没太弄明白什么意思

解决方案 »

  1.   

    Monitor.Enter(X);  
     
      操作
     
    Monitor.Exit(X);
      

  2.   

    支持需要lock住公用的部分,lock的意思就是说只能有一个线程加或者取,这样就可以保证操作都有效
      

  3.   

    有必要lock么
    thread producer
    {
        queueX.enqueue(item);
    }thread consumer
    {
        if(queueX.count>0)
        {
            X = queueX.dequeue();
        }
    }就算是不同线程来操作也应该不会有冲突的地方啊?
      

  4.   

    1、使用AutoResetEvent 或其他线程同步类,在接收线程接收到数据且放入队列之前,让发送线程处于
       等待状态,等接收线程处理完成后给发送线程发信号,让他处理刚刚收到的数据。
    or2、用lock锁定队列对象
      

  5.   

    为何明明queue.count>0的情况下dequeue出来还有null的东西?
      

  6.   


    if(queueX.count>0)
      {
    线程1进到这里,上句queueX.count判断成功,此时线程1被CPU打断,执行线程2(也是取数据的),然后在执行线程1
      X = queueX.dequeue();
      }
      

  7.   


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