Fil*_*efp 15

std::async  ([]() { ... });            // (1)
std::thread ([]() { ... }).detach ();  // (2)
Run Code Online (Sandbox Code Playgroud)

通常在std::async讨论的时候,首先要注意的是它已经被破坏了,这个名字意味着当返回的值不被接受时(在当前范围的末尾被分配给要被破坏的变量),这些东西不能保留.

在这种情况下,破碎std::async是到底是怎么回事导致之间的巨大差异(1)(2); 一个会阻止,另一个不会.


为什么std::async在这种背景下阻止?

返回值std::async是一个std::future其中有一个阻挡析构函数代码继续之前必须执行.

在一个例子中,因为下面的g内容f在完成之前不会执行,只是因为(3)在相关语句中完成所有工作之前,不能销毁未使用的返回值.

std::async (f); // (3)
std::async (g); // (4)
Run Code Online (Sandbox Code Playgroud)

目的是std::thread (...).detach ()什么?

脱离std::thread我们只是说; "我不再关心这个线程句柄,请执行该死的东西."

继续一个类似于前一个(关于std::async)的例子,差异非常明显; 双方fg会同时执行.

std::thread (f).detach ();
std::thread (g).detach ();
Run Code Online (Sandbox Code Playgroud)