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上.
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
您正在使用锁来确保对队列的访问是线程安全的,不是吗?