list1,list2threadA()
{
  while(1)
  {
   new obj1;
   list1.AddTail(obj1);
   PostMessageToThreadB();
  }
}threadB::OnReceiveMessage()
{
    new obj2;
    list2.AddTail(obj2);   
}
threadC()
{
   while(1)
  {
    while(list1.RemoveHead())
       //do...
    while(list2.RemoveHead())
       //do...  }
}上面就是程序的大概结构.有两个队列,先进先出的.
线程A和线程B向两个队列里依次插入数据.  顺序是先A后B, 而且是一一对应的.
线程C依次处理两个队列里的数据.限制是,对于一次产生的两条数据,必须是先处理队列1,后处理队列2的.现在有多个线程A的实例,还有多个线程C的实例.出现了问题:
当执行while(list2.RemoveHead())的过程中,
如果线程A新产生了一条数据,分别插入了队列1和队列2,就会先执行队列2,后执行队列1.如何避免这种问题?

解决方案 »

  1.   

    从list2中取出数据后,再查一次list1,确认无数据后再处理。
      

  2.   

    在每一笔数据中加上Index,从小到大递增,从list2中取出数据后,再查一次list1,如果无数据后就处理,如果有数据就比对Index值,list2中的Index大于list1当前的Index值再处理.
      

  3.   


    你看这样行不,
    为什么不设置一个对象来管理list呢
    提供一个获取obj1的接口,
    获取obj2的接口,参数就是同一次的obj1,然后就是在这个管理对象里面做好同步
      

  4.   

    threadC()
    {
      while(1)
      {
        int nIndex = 0;
        while(list1.RemoveHead())
        nIndex++;
        //do...
        while((list2.RemoveHead()) && (nIndex > 0))
        nIndex--;
        //do...  }
    }
    是这个意思么?