【发布时间】:2016-01-19 17:45:56
【问题描述】:
我有一个线程 A 正在添加的对象队列。线程 B 正在从队列中删除对象并处理它们。可能有很多线程 A 和很多线程 B。
当队列被“推送”到时,以及“前端”和“弹出”时,我正在使用互斥锁,如下面的伪代码所示:
线程 A 调用这个来添加到队列中:
void Add(object)
{
mutex->lock();
queue.push(object);
mutex->unlock();
}
线程 B 处理队列如下:
object GetNextTargetToWorkOn()
{
object = NULL;
mutex->lock();
if (! queue.empty())
{
object = queue.front();
queue.pop();
}
mutex->unlock();
return(object);
}
void DoTheWork(int param)
{
while(true)
{
object structure;
while( (object = GetNextTargetToWorkOn()) == NULL)
boost::thread::sleep(100ms); // sleep a very short time
// do something with the object
}
}
困扰我的是while---get object---sleep-if-no-object范式。虽然有要处理的对象,但它很好。但是在线程等待工作的时候有两个问题
a) while 循环正在消耗资源
b) 睡眠意味着浪费时间是一个新的对象进来处理
是否有更好的模式来实现相同的目标?
【问题讨论】:
-
要使用的“模式”是一个条件变量。
-
.. 或信号量.....
-
旁注:不要显式调用
lock和unlock。 C++11 为您提供lock_guard 用于mutex锁定的异常/程序员安全RAII 管理,请使用它。
标签: c++ multithreading queue