Per*_*kie 26 c++ concurrency multithreading asynchronous
据我所知,async在另一个线程/进程/核心中执行一个函数并且不阻塞主线程,但总是这样吗?
我有以下代码:
async(launch::async,[]()
{
Sleep(1000);
puts("async");
});
puts("main");
Run Code Online (Sandbox Code Playgroud)
它打印async main,这是否意味着主线程等待直到async完成?
如果我改为以下:
auto f = async(launch::async,[]() // add "auto f = "
{
Sleep(1000);
puts("async");
});
puts("main");
Run Code Online (Sandbox Code Playgroud)
它打印main async.这使得看起来主要不等待async完成.
Vit*_*meo 27
我知道async在另一个线程/进程/核心中执行一个函数并且不阻塞主线程,但是它总是会发生吗?
std::async只有在std::launch::async作为第一个参数传递时,才能保证在单独的线程上执行:
std::launch::async:启动新线程以异步执行任务std::launch::deferred第一次请求结果时,在调用线程上执行任务(延迟评估)
默认启动策略是std::launch::async | std::launch::deferred.
std::async回报std::future.只有在未来从以下方面返回时,std::future析构函数才会阻塞std::async:
这些操作不会阻止共享状态准备就绪,除非它可能阻塞以下所有条件都是真的:共享状态是通过调用std :: async创建的,共享状态尚未准备就绪,这个是共享状态的最后一个引用
在您的第一个代码片段中,您创建一个立即销毁的rvalue表达式 - 因此将在之前打印."async""main"
创建异步匿名函数并开始执行.
异步匿名函数被破坏.
main 执行被阻止,直到功能完成.
"async" 打印出来.
main 执行恢复.
"main" 打印出来.在第二个代码段中,创建一个左值表达式,其生命周期绑定到变量f.f将在结束时破坏main功能的范围 -因此"main"将前被打印"async"由于Delay(1000).
创建异步匿名函数并开始执行.
Delay(1000)延迟"async".main 继续执行.
"main" 打印出来.结束main范围.
异步匿名函数被破坏.
main 执行被阻止,直到功能完成.
"async" 打印出来.
它打印
async main,这是否意味着主线程等待直到async完成?
是的确如此,但那是因为你没有从中获取返回的未来async. async特别之处在于它future从析构函数中返回,直到线程完成为止.既然你没有捕获返回的future
async(launch::async,[]()
{
Sleep(1000);
puts("async");
});
Run Code Online (Sandbox Code Playgroud)
必须在当前线程中进行完成之前完成,因为返回的future内容在表达式结束时被销毁.
它打印
main async.这使得看起来主要不等待async完成.
这是你打电话时真正想要的async.由于您已捕获了未来,因此在完成异步任务时,允许主线程继续运行.因为你有一个延迟,该线程main将在线程之前打印.