另一种检查std :: queue事件的方法?

use*_*454 3 c++ queue events multithreading std

好吧,我正在尝试处理某种队列.我有一个IO线程,它专门用于从std :: queue中弹出数据,但问题是我正在使用Sleep()以防止100%cpu常量检查.当然还有其他线程会将项添加到std :: queue.

我怎样才能创建一个事件,以便线程处于休眠状态,并且在std :: queue不为空时才启动?

IO线程

Sleep(100);
while (!myqueue.empty())
  {
     //process data FIFO
     myqueue.pop(); //pop out and continue
  }
Run Code Online (Sandbox Code Playgroud)

非常感谢,谢谢!哦,这对于c ++ 11或c ++ 03来说无关紧要 - 在Windows上.

Jan*_*dec 7

std::queue绝对无关,与线程.完全没有.它的.empty()成员不是线程安全的(只有可重入)!这同样适用于所有其他成员.因此,多个线程可以使用不同的队列,但是每次只有一个线程可以对每个实例执行任何操作.

C++ 11或C++ 03非常重要.因为C++ 11定义了线程同步原语,而C++ 03没有,你必须使用OS API.

在C++ 11中你会感兴趣的std::condition_variable.

在C++ 03中,您会对Boost.Thread(主要与C++ 11兼容)事件信号量感兴趣.

在任何一种情况下std::queue::push(),std::queue::pop()它们本身必须受到相互排斥的保护.该std::condition_variable甚至强迫你使用一个(std::mutex),在Windows API你使用临界区.

在Windows上,C++ 11类仅在Visual Studio 2012和Windows 8中可用.较旧的编译器使用Boost(优点是它可以是可移植的)或本机API.


小智 1

您需要一个“条件变量”。每当线程将某些内容放入队列时,它就会“通知”等待条件变量的线程。消耗队列中的事件的线程等待条件变量。它处于睡眠状态,直到有人通过条件变量通知它。

Boost 有一个很好的实现:http://www.boost.org/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref

您正在使用锁来确保对队列的访问是线程安全的,不是吗?