C ++ async + future(延迟vs异步)

时间:2018-02-22 02:56:13

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

这是我正在使用的测试程序。 有人可以详细描述正在发生的事情以及输出的原因。

为什么launch::asyncg_num值设为0,而launch::deferred获得100

launch::asynclaunch::differed都得到arg堆栈上main的正确值,我相信这意味着他们应该得到100

#include <iostream>
#include <future>
using namespace std;

thread_local int g_num;

int read_it(int x) {
    return g_num + x;
}
int main()
{
    g_num = 100;
    int arg;
    arg = 1;
    future<int> fut = async(launch::deferred, read_it, arg);
    arg = 2;
    future<int> fut2 = async(launch::async, read_it, arg);
    cout << "Defer: " << fut.get() << endl;
    cout << "Async: " << fut2.get() << endl;
    return 0;
}

输出:

Defer: 101
Async: 2

2 个答案:

答案 0 :(得分:5)

documentation表示launch::deferred将在调用线程上调用该函数,而launch::async将在新线程上调用该函数。

对于调用线程,g_num的值是您在main中设置的值。对于新线程,该值是值初始化的(0的{​​{1}}),因为您从未设置它。感谢@MilesBudnek进行更正。

答案 1 :(得分:2)

g_num定义为thread_local这意味着您应用中的每个广告都有自己的g_num

副本

launch::deferred在调用线程上运行。主线程上的g_num已更改为100.在launch::async启动的线程上没有更改,这是其值仍然是默认值的原因。