【发布时间】:2020-09-01 07:35:24
【问题描述】:
我想在工作线程中实现一个处理循环,以便它在有东西时处理队列中的数据并阻塞(线程休眠)否则......这甚至可能吗?也应该没有任何明显的延迟。
像这样简单的事情:
std::deque<Foo> queue;
void worker()
{
while (active) {
blockAndWaitForData();
while (!queue.empty()) {
doSomething(queue.front());
queue.pop_front();
}
}
}
当然需要锁定队列以及一些其他细节。
如果需要,也可以直接使用 Linux API。
【问题讨论】:
-
看condition variables,另外最好使用某种形式的无锁队列(比如
boost::lockfree::queue)。 -
使用
std::condition_variable表示数据的可用性。更好的是,使用existing threadsafe queue implementation。 -
您所要求的有一个名称:您要求的是一个阻塞队列。也就是说,一个队列,其方法会自动阻止尝试访问
front对象的调用者,直到那里有可以访问的对象。
标签: c++ linux multithreading loops c++17