【发布时间】:2013-02-04 11:45:53
【问题描述】:
嗯,我正在尝试处理某种队列。我有一个 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
}
非常感谢,谢谢!哦,这对于 c++11 或 c++03 没关系 - 在 Windows 上。
【问题讨论】:
-
C++11 与否?如果不是,是哪个操作系统?
-
这叫信号量...
-
执行此操作的典型方法是使用
condition_variable。 Anthony Williams 回顾了这种实现 here 的一些细节。 -
我强烈建议您阅读有关线程同步的内容。这是一个相当困难的话题,您的代码将需要进行重大更改以避免所有陷阱。因为它不仅仅是锁定操作(
empty、pop),还意味着正确地对它们进行排序并将正确的操作锁定在一起。 -
像@Tony 提示一样,驱动程序->线程通信通常由信号量信号执行。创建计数为零的信号量。在您的驱动程序中,推动一个对象,发出信号量。在您的线程中,等待信号量,弹出一个对象。转储 Sleep() 并查看 MSDN 以了解信号量 API 和 Windows 同步原语。
标签: c++ multithreading events queue std