2个线程需要共享数据。线程1:生产线程.负责往队列里面不停添加数据。
线程2:消费线程.负责从队列里面不停取走数据,处理。我本意是想设计一个队列来作为缓冲,来处理采集的数据。这2个线程之间需要同步控制么,如何操作为好?

解决方案 »

  1.   

    需要同步,加个锁CriticalSection即可
      

  2.   

    请参见:http://blog.csdn.net/kyeehttp://blog.csdn.net/kyee增加一个事件即可。
      

  3.   

    // 队列对象和事件对象
    TQueue* FQueue;
    TEvent* FEvent;// 加入数据
    bool AddData(void* AData)
    {
       // 初始化
       bool result = false;   // 加入队列
       if (FQueue->Push(AData))
       {
          FEvent->Set();
          result = true;
       }   // 返回结果
       return result;
    }// 取数据函数
    bool GetData(void* &AData, Longword ATimeout)
    {
       // 初始化
       bool result = true;   // 取队列数据
       if (FQueue->Count() != 0)
          AData = FQueue->Pop();
       else
       {
          // 等待事件
          FEvent->Wait(ATimeout);      // 取队列数据
          if (FQueue->Count() != 0)
             AData = FQueue->Pop();
          else
             result = false;
       }   // 返回结果
       return result;
    }// 若处理数据直接放在线程中
    void DoExecute(TThread* AThread, void* AParam)
    {
       // 初始化
       void*    pData;
       Longword dwNo, dwCount;   // 线程循环体
       while (!AThread->Terminated())
       {
          // 等待事件
          FEvent->Wait();      // 循环处理队列数据
          dwNo    = 0;
          dwCount = FQueue->Count();
          while (!AThread->Terminated() && (dwNo++ < dwCount))
          {
             pData = FQueue->Pop();         // 处理数据
             // ??? ... ...
          }
       }
    }
      

  4.   

    Event可以,我推荐用信号量CreateSemaphore
      

  5.   

    Event可以,我推荐用信号量CreateSemaphore
      

  6.   

    楼上有的tx说用事件event。那么event不就是多线程同步的一种方式么?怎么leither同学说不需要呢?迷糊了再请达人指点。
      

  7.   

    部门的一个同事跟我讲线程之间的切换或者同步控制需要耗费大量的资源,CPU资源耗费很大。我有点纳闷,这种场合下同步控制似乎是必需的,多线程同步控制的CPU资源消耗需要我们程序员去考虑么?难道说消耗真的那么大么?由于这次的项目的确对CPU要求很高,由于是实时处理海量数据,所以我也没底。
      

  8.   

    采用临界区是耗费资源最低的线程同步方法,当获取临界区成功的时候,不需要进行用户态到内核态的转换,而其他采用内核对象同步方式都必须要进行用户态和内核态的转换。所以推荐使用临界区。但是临界区用不好,容易死锁,因为他没有timeout,所以要小心。
      

  9.   

    不仅要同步(waitforsingleobject...),而且要互斥(entercriticalsection, leavecriticalsection...)。