【发布时间】:2015-08-28 21:22:43
【问题描述】:
我对@987654321@ 函数有点困惑。
规范说:
“就像在新的执行线程中一样”执行异步操作(C++11 §30.6.8/11)。
现在,这是什么意思?
在我的理解中,代码
std::future<double> fut = std::async(std::launch::async, pow2, num);
应该在一个新线程上启动函数pow2并将变量num按值传递给线程,然后在将来某个时候,当函数完成时,将结果放在fut中(只要函数pow2 具有类似double pow2(double); 的签名)。但是规范声明“好像”,这让整个事情对我来说有点模糊。
问题是:
在这种情况下是否总是启动新线程?我希望如此。我的意思是,参数std::launch::async 是有意义的,我明确表示我确实想创建一个新线程。
还有代码
std::future<double> fut = std::async(std::launch::deferred, pow2, num);
应该通过延迟 pow2 函数调用到我写类似 var = fut.get(); 的点来使 惰性评估 成为可能。在这种情况下,参数std::launch::deferred 应该意味着我明确说明,我不想要一个新线程,我只是想确保在需要返回值时调用该函数。
我的假设正确吗?如果不正确,请解释一下。
另外,我知道函数默认调用如下:
std::future<double> fut = std::async(std::launch::deferred | std::launch::async, pow2, num);
在这种情况下,我被告知是否会启动新线程取决于实现。再说一遍,这是什么意思?
【问题讨论】:
-
“好像”意味着它理论上可以重用现有线程(例如,在线程池中),只要行为无法区分。实际上,很少有(如果有的话)实现这样做,因为“好像一个新线程”要求您销毁并重新创建所有线程局部变量。
-
@T.C.或实现(重)协程局部变量。让每个线程获得一个默认协程,
thread_local是本地协程。async可以创建一个协程,该协程可以放入另一个线程并运行。即,在操作系统提供的线程模型之上模拟线程(使用协程)? -
我注意到
std::async坏了,是真的吗? -
@DavidHaim 异步操作并不意味着“在另一个线程上”。它只是意味着发生时没有与另一个动作同步(在这种情况下,同步是在另一个动作完成时)。这可能意味着在另一个线程上......或其他七十二个东西。
-
@TheFloatingBrain 你从哪里“听到”的?并定义“破碎”。我觉得很好。
标签: c++ multithreading c++11 future stdthread