这是我正在使用的测试程序。 有人可以详细描述正在发生的事情以及输出的原因。
为什么launch::async
将g_num
值设为0
,而launch::deferred
获得100
。
launch::async
和launch::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
答案 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
启动的线程上没有更改,这是其值仍然是默认值的原因。