【问题标题】:What is the semantics of std::async with automatic (launch::async|launch::deferred) launch policy?具有自动 (launch::async|launch::deferred) 启动策略的 std::async 的语义是什么?
【发布时间】:2020-11-19 16:07:37
【问题描述】:

std::async 有两个重载,其中一个使参数 std::launch policy 显式,而另一个省略此参数。该策略是位掩码,因此可以同时指定launch::async|launch::deferred(或者您可以使用省略此参数的函数来避免策略)。在这种情况下,策略会在后台自动选择,并且不能保证选择。我想知道使用这种“未知”策略的原因是什么。

首先,您不应该将此策略与wait 函数一起使用:您可能只是收到future_status::deferred 响应后发现调用此函数没有用。接下来,如果您计划仅在某个点上设置 get 的值,则可以使用默认策略,但我认为没有理由将此选择保留在系统/库实现上,因为即使 std::launch::async 也可以优化用于执行。无论如何,实际显式选择的策略强烈影响使用模式,使用设计隐藏此信息的功能非常奇怪。

当有人希望将策略选择留给系统时,什么可能是实际用例?

【问题讨论】:

    标签: c++ c++11 stdasync


    【解决方案1】:

    如果您想使用最适合系统的设置,请使用默认设置。

    您永远不应该假设future 在另一个线程上执行。仅将它用于足够独立的代码,以至于它在执行时并不重要。也许这是我个人的偏好,但我认为否则会产生讨厌的代码。如果您真的需要线程,请使用线程。

    在具有一个内核的小型 CPU 上,最好的策略可能是在启动 async|deferred 任务后立即在同一线程中运行它。如果您要运行四个任务,效果将是一个接一个地运行它们。但在高端 CPU 上,它可以同时运行所有四个并节省时间。

    【讨论】:

    • 我的问题不同。我不是在问我应该更喜欢什么启动策略,而是默认策略的用例是什么。当我应该更喜欢最适合系统的东西时,用例是什么?如果我确定 GCC 总是更喜欢 std::launch::deferred 而 MSVC 总是更喜欢 std::launch::async,我会使用明确的策略来避免歧义,否则我想我根本不需要 std::async
    • @DmitryKuzminov 你不认为你可以相信图书馆建设者会做对吗?
    猜你喜欢
    • 2012-07-13
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2017-06-19
    • 2012-04-21
    • 2019-02-19
    相关资源
    最近更新 更多