C++ 11 std::thread 循环

Posted

技术标签:

【中文标题】C++ 11 std::thread 循环【英文标题】:C++ 11 std::thread in cycles 【发布时间】:2015-05-18 21:35:52 【问题描述】:

我在 C++11 中有一个这样的循环:

while (true) 

    std::thread t0(some_work, 0);
    ...
    std::thread tn(some_work, n);
    t0.join();
    ...
    tn.join();

但在每次迭代中创建新线程当然不好。在 C 中,很容易使用消息来告诉线程等待另一次迭代,但我想使用 C++11 工具来完成。我查看了condition_variable,但我认为这不是解决方案。我能用它做什么?

【问题讨论】:

【参考方案1】:

使用 Boost 打通!

注意:我没有 C++11,所以我将向您展示的代码是用于 C++98 的 Boost libraries。大多数 Boost 内容都以 std::tr1 和随后的标准版本结束,因此其中大部分内容可能无需 Boost 即可转移。

听起来你有多个线程,你不断地但不是一致地分配工作要做。这项工作并不总是需要执行(否则您的线程可以在自己的循环中执行)或者线程可能没有执行它的信息。如果是这种情况,请考虑boost::asio::io_service

这样,您将需要创建一个始终运行的线程,因此您可能希望将您的线程放在一个类中(尽管您不需要这样做)。

class WorkerThread

    WorkerThread()
    : thread(&WorkerThread::HandleWorkThread, this), io_service(), runThread(true)
    
    
    ~WorkerThread()
    
        // Inform the thread not to run anymore:
        runThread = false;
        // Wait for the thread to finish:
        thread.join();
    
    void AssignWork(boost::function<void()> workFunc)  io_service.post(workFunc); 
private:
    void HandleWorkThread()
    
        while (runThread)
        
            // handle work:
            io_service.run();
            // prepare for more work:
            io_service.reset();
        
    

    boost::thread thread;
    boost::asio::io_service io_service;
    bool runThread; // NB: this should be atomic
;

现在您可以拥有以下内容:

void CalculateThings(int, int);
void CalculateThingsComplex(int, int, double);

// Create two threads. The threads will continue to run and wait for work to do
WorkerThread thread1, thread2;
while (true)

    thread1.AssignWork(boost::bind(&CalculateThings, 20, 30));
    thread2.AssignWork(boost::bind(&CalculateThingsComplex, 2, 5, 3.14));

您可以根据需要继续分配尽可能多的工作。一旦WorkerThreads 超出范围,它们将停止运行并很好地关闭

【讨论】:

嗯我有一个问题,因为我希望主流调用一些函数(如 apply_changes();) 在所有线程都完成它们的工作之后,所以我可能需要类似消息

以上是关于C++ 11 std::thread 循环的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::thread 函数 C++11 将指针作为参数传递

是否有任何理由应该将 C++ 11+ std::mutex 声明为全局变量,而不是作为函数参数传递给 std::thread ?

C++ std::thread概念介绍

带有 winsock 和 std::thread 的 C++ 多线程服务器

如何使用 std::thread C++ 生成多个调用相同函数的线程 [关闭]

C++每日一练3.创建一个线程