我传递给std :: async的函数打印当前的线程ID。尽管使用std :: launch :: async标志进行调用,但它会打印相同的thead id。这意味着它同步调用该函数。为什么呢?
void PrintThreadId()
{
std::cout << std::this_thread::get_id() << std::endl;
}
int main()
{
for (int i = 0; i < 5; ++i)
{
auto f = std::async(std::launch::async, PrintThreadId);
f.wait();
}
}
输出是: 20936 20936 20936 20936 20936
环境:VS 2015,W7。
提前谢谢!
答案 0 :(得分:4)
您实际上是通过等待每个调用来序列化调用,因此可以重用相同的线程而不会破坏std::future
由与调用者线程不同的线程执行的规范
当以下代码与其余代码显示相同的Caller ThreadId
时,请将我们唤醒:
void PrintThreadId()
{
std::cout << std::this_thread::get_id() << std::endl;
}
int main()
{
std::cout << "Caller threadId (to be different from any id of the future exec thread): ";
PrintThreadId();
for (int i = 0; i < 5; ++i)
{
auto f = std::async(std::launch::async, PrintThreadId);
f.wait();
}
}
答案 1 :(得分:3)
你未来的生命周期以函数每次迭代的范围结束。与之相关的线程也会消失。该实现可以在以后自由重用,即在循环的下一次迭代中。
如果您修改示例代码以打印当前线程ID,您将看到当前线程不同:
for (int i = 0; i < 5; ++i)
{
PrintThreadId();
auto f = std::async(std::launch::async, PrintThreadId);
f.wait();
}
您还应该考虑返回的期货async
是特殊的 - 在它们阻止的析构函数中,直到任务未完成。有关Scott Meyers博客的更多信息,标题为:std::futures
from std::async
aren't special。