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

时间:2014-10-17 03:22:17

标签: c++ multithreading thread-safety std

我在我的C ++方法的main()方法中有这行代码:

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?
    }
}

这似乎处理整个线程安全问题允许它们在没有时间等待的情况下同时安全地运行。唯一的问题是我不知道如何重新启动线程。我该怎么做?

2 个答案:

答案 0 :(得分:2)

阅读一些文档,我发现这有效:

myOldThread = thread(foobar);

我认为还有相当多的性能开销,但至少我可以重用相同的变量。 :/


另一种方法是永远不要让线程死掉(有一个200ms延迟的循环,检查一个互斥锁保护的布尔值,它应该再次运行)。不是超级干净,但如果性能很重要,这可能是最好的方法。

答案 1 :(得分:1)

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

How to create a thread pool using boost in C++?