我有一个多线程单生成器单个使用者进程,其中我使用无锁队列(boost :: lock_free :: spsc_queue)。
现在我有两个while循环运行(紧,没有任何等待),只要队列中有任何可用的东西,它就会被处理。但是,即使没有什么可以处理的,我也不希望我的消费者方面全面工作(while(true)
)。因此,我正在寻找类似于下面的行为。
bool running = true;
void producer() {
while(running) {
if (\*something to process*\)
{
\*process data and push to the queue*\
}
}
}
void consumer() {
while (running) {
if (!queue.empty()) {
\* pop and process data *\
} else {
\* wait till queue is not empty *\
}
}
}
为了给出更多的上下文,队列有市场数据,因此,有时,push
可能不会在生产者方面长时间发生,这就是我希望我的消费者线程等待的时候。因此,我正在寻找某种事件处理方式。
我一直在关注conditional_variable但似乎无法使其适应当前的上下文,因为我没有任何类型的锁定。
如果有人有任何想法来实现这种行为(使用STL或boost),我将非常感激。感谢。
答案 0 :(得分:1)
我建议使用tbb :: concurrent_bounded_queue。它可以在等待新项目或释放空间的OS事件上休眠(达到指定的容量限制时)。它使用细粒度的用户级同步,并且在热门路径上无锁(如果'无锁'是销售的品牌)。
答案 1 :(得分:0)
如果消费者处理时间不敏感,您可以在检查今天是否有任何工作之间将该线程置于休眠状态一段时间。
否则,最直接的方法是添加一个锁(仅用于控制条件变量)和一个条件变量,以便在工作被推入队列时向消费者发出信号。