默认启动策略与std :: launch :: deferred之间的区别

时间:2015-11-26 10:26:38

标签: c++ multithreading c++11 asynchronous std

我写了一些代码来诊断默认启动策略和std :: launch :: deferred之间的区别。

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

int main() {

    auto func = [] { 
        std::cout << std::this_thread::get_id() << "," << std::flush; 
        int i=std::numeric_limits<int>::max(); 
        while(i--); 
        std::cout << "b" << std::flush;
    };

    std::vector<std::future<void> > vec;
    for (int i = 0; i < 10; ++i) {
      vec.push_back(std::async( std::launch::deferred, func ));
    }
    for (auto &t : vec) {
      t.get();
    }

}

上述代码的输出是:

  

140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,b140257438672704,B

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

int main() {

    auto func = [] { 
        std::cout << std::this_thread::get_id() << "," << std::flush; 
        int i=std::numeric_limits<int>::max(); 
        while(i--); 
        std::cout << "b" << std::flush;
    };

    std::vector<std::future<void> > vec;
    for (int i = 0; i < 10; ++i) {
      vec.push_back(std::async( func ));
    }
    for (auto &t : vec) {
      t.get();
    }

}

上述代码的输出是:

  

140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,b140200948524864,B

它仍在主线程上运行任务。 我的问题是为什么在使用默认启动策略(我的机器有4个内核)时,它没有安排更多线程运行得更快?

1 个答案:

答案 0 :(得分:1)

根据cppreference.com,当您未明确传递政策时:

  

1)与async(std :: launch :: async | std :: launch :: deferred,f,args ...)的行为相同。换句话说,f可以在另一个线程中执行,或者当查询结果std :: future时,它可以同步运行。

当两个标志都启用时:

  

如果在策略中设置了std :: launch :: async和std :: launch :: deferred标志,则由实现决定是执行异步执行还是延迟评估。

因此,不同之处在于默认情况下,策略是启动延迟或异步。选择取决于实施。当政策推迟时,那么lauch只能推迟。

  

我的问题是为什么在使用默认启动策略(我的机器有4个核心)时它没有安排更多线程运行得更快?

这不是必需的,并且实现选择不这样做。