C++ 在C++;,如何重用已完成执行的标准线程?

C++ 在C++;,如何重用已完成执行的标准线程?,c++,multithreading,thread-safety,std,C++,Multithreading,Thread Safety,Std,我在C++代码的< ())/中有这行代码: std::thread foo (bar); 那很好。但是,我希望在任何时候基于外部输入运行同一个线程。如何重新使用此线程以再次运行该线程 我这样做的原因是我有两个函数需要同时运行:一个是阻塞,获取输入x,并以设定的间隔将数据输出到输出。另一个是阻塞,并根据外部输入生成输出y。这基本上就是它应该看起来的样子: int shared_x = 0; int producer_x = 0; int consumer_x = 0; std::thread

我在C++代码的< <代码>())/<代码>中有这行代码:

std::thread foo (bar);
那很好。但是,我希望在任何时候基于外部输入运行同一个线程。如何重新使用此线程以再次运行该线程

我这样做的原因是我有两个函数需要同时运行:一个是阻塞,获取输入x,并以设定的间隔将数据输出到输出。另一个是阻塞,并根据外部输入生成输出y。这基本上就是它应该看起来的样子:

int shared_x = 0;
int producer_x = 0;
int consumer_x = 0;

std::thread producer (foo);    //Modifies foo_x
std::thread consumer (bar);    //Outputs based on foo2_x
while( ;; ) {
    if(producer .join()) {
        shared_x = producer_x;
        //How should I restart the thread here?
    }
    if(consumer.join()) {
        consumer_x = shared_x;
        //Here too?
    }
}

这似乎解决了整个线程安全问题,并允许它们在几乎没有等待时间的情况下同时安全地运行。唯一的问题是我不知道如何重新启动线程。如何做到这一点?

Boost::ThreadPool也是一个不错的选择。通过使用它,您可以从池中拾取线程以分配任务


通过阅读一些文档,我发现以下方法很有效:

myOldThread = thread(foobar);
我假设仍然存在相当大的性能开销,但至少我可以重用相同的变量:/



另一种方法是永不让线程消亡(有一个延迟200ms的循环,用于检查受互斥体保护的布尔值,以确定它何时应该再次运行)。不是超级干净,但如果性能很重要,这可能是最好的方法。

查看“条件变量”。可能重复的情况请确保在赋值之前在线程上调用join()。否则,旧线程将被视为活动线程,赋值运算符将抛出异常。警告:代码不使用旧线程-它只是创建新线程并将其赋值给旧对象。