我已经使用并发队列(queue)来让队列从其他线程接收元素-
每次每次线程将元素添加到并发队列中时,我都会调用一些方法来创建新线程,以从队列中获取元素并进行处理(调用某个对此项目执行某些操作的方法)
concurrency::concurrent_queue<Item> _queue;
void handleItem(Item item)
{
// do something with item
}
// method that call every time add something to the queue - can be
// situation that the queue contain more then one item
void handleQueueItem()
{
Item item;
while (_queue.try_pop(item))
{
std::thread t1(&handleItem, item);
t1.join(); // wait till finish before handle next item.
}
}
我想以其他方式创建线程t1,这样我就不需要在队列中有东西的时候再创建新的线程
我不知道该怎么做。
答案 0 :(得分:2)
您可以使handleQueueItem
在其自己的线程中运行,而不是在handleQueueItem
中扩展线程,并且它将连续运行。看起来像
void handleItem(Item item)
{
// do something with item
}
void handleQueueItem()
{
Item item;
while (_queue.try_pop(item))
{
handleItem(item)
}
}
std::thread runner([](){ handleQueueItem(); });
您甚至可以在循环中添加一个标志,这样就可以通过添加一个std::atomic<bool>
变量并像这样在循环中对其进行检查来停止线程
std::atomic<bool> run = true;
void handleQueueItem()
{
Item item;
while (run && _queue.try_pop(item))
{
handleItem(item)
}
}
std::thread runner([](){ handleQueueItem(); });
// later on
run = false;
runner.join();
然后您要做的就是run = false;
使循环停止。