async总是在C++中使用另一个线程/核心/进程吗?

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"

    1. 创建异步匿名函数并开始执行.

    2. 异步匿名函数被破坏.

      • main 执行被阻止,直到功能完成.

      • "async" 打印出来.

    3. main 执行恢复.

      • "main" 打印出来.

  • 在第二个代码段中,创建一个左值表达式,其生命周期绑定到变量f.f将在结束时破坏main功能的范围 -因此"main"将前被打印"async"由于Delay(1000).

    1. 创建异步匿名函数并开始执行.

      • 立即打印有Delay(1000)延迟"async".
    2. main 继续执行.

      • "main" 打印出来.
    3. 结束main范围.

    4. 异步匿名函数被破坏.

      • main 执行被阻止,直到功能完成.

      • "async" 打印出来.

  • @JAB:懒惰的评估被认为是有用的,默认情况下某些语言是惰性的;) (6认同)

Nat*_*ica 6

它打印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将在线程之前打印.