如何停止正在运行的线程并在创建新线程旁边恢复同一线程?

时间:2019-01-11 21:54:45

标签: c++ multithreading

我已经使用并发队列(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,这样我就不需要在队列中有东西的时候再创建新的线程

我不知道该怎么做。

1 个答案:

答案 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;使循环停止。