同时运行不同的线程而不等待其他线程完成

时间:2016-12-04 07:31:25

标签: c++ linux multithreading

问题是我想使用c ++库同时运行不同的线程,而没有其他线程等到前面的线程完成并且每个线程中的功能同时运行,我说的是要运行的代码在线程中;示例代码如下所示。

   while(condition is true<it is infinite loop >){
   running sleep here with random time
     sleep(random time(sec))
     rest of the code is here
   }

这个无限while循环在每个线程中运行。我希望在每个线程中运行此while循环以同时运行而不会卡在要完成的第一个线程中。换句话说,所有无限while循环(在每个线程上下文中)都要同时运行。我如何实现这一目标?如果你可以请分享一些示例代码实际上我已经使用了async,但我使用<thread>获得了与普通join()相同的行为。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是因为std::async(在我看来)的相当愚蠢的定义,它不必异步执行您的代码,但可以在您尝试获取时运行它来自其std::future返回值。

不管。如果将调用的第一个参数设置为std::launch::async,则强制它以异步方式运行。然后,您可以将未来保存在容器中,如果您定期从此容器中退出期货,则可以运行系统允许的多个线程。

以下是一个例子:

#include <iostream>
#include <thread>
#include <future>
#include <chrono>
#include <vector>
#include <mutex>

using future_store = std::vector<std::future<void>>;

void retireCompletedThreads(future_store &threadList)
{
    for (auto i = threadList.begin(); i != threadList.end(); /* ++i */)
    {
        if (i->wait_for(std::chrono::seconds(0)) == std::future_status::ready)
        {
            i->get();
            i = threadList.erase(i);
        }
        else
        {
            ++i;
        }
    }
}

void waitForAllThreads(future_store &threadList)
{
    for (auto& f : threadList)
    {
        f.get();
    }
}

std::mutex coutMutex;

int main(int argc, char* argv[])
{
    future_store threadList;

    // No infinite loop here, but you can if you want.
    // You do need to limit the number of threads you create in some way though,
    // for example, only create new threads if threadList.size() < 20.
    for (auto i = 0; i < 20; ++i)
    {
        auto f = std::async(std::launch::async,
                [i]() {
                {
                    std::lock_guard<std::mutex> l(coutMutex);
                    std::cout << "Thread " << i << " started" << std::endl;
                }
                std::this_thread::sleep_for(std::chrono::seconds(1));
                {
                    std::lock_guard<std::mutex> l(coutMutex);
                    std::cout << "Thread " << i << " completed" << std::endl;
                }
                });
        threadList.push_back(std::move(f));

        // Existing threads need to be checked for completion every so often
        retireCompletedThreads(threadList);
    }
    waitForAllThreads(threadList);
}