std::async有两个重载,其中一个使参数std::launch policy显式,而另一个省略此参数。该策略是位掩码,因此可以同时指定两个launch::async|launch::deferred (或者您可以使用忽略此参数的函数来避免该策略)。在这种情况下,策略是自动选择的,并且不能保证选择。我想知道使用这个“未知”政策的原因是什么。
首先,您不应该将此策略与wait函数一起使用:您可能会得到future_status::deferred响应,发现调用此函数是无用的。接下来,如果您只计划在某个时刻get该值,则可以使用默认策略,但我认为没有理由将此选择保留在系统/库实现上,因为即使是std::launch::async也可能优化用于执行的线程数量。无论如何,实际显式选择的策略会对使用模式产生很大影响,而且在设计时使用隐藏此信息的函数非常奇怪。
当有人倾向于将策略选择留给系统时,什么可能是实际的用例?
发布于 2020-07-30 10:16:33
当您想要使用最适合系统的选项时,请使用默认值。
您不应该假设future在另一个线程上执行。只有在代码足够独立的情况下才使用它,这样它什么时候执行都无关紧要。也许这是我个人的偏好,但我认为,如果不这样做,就会产生令人讨厌的代码。如果你真的需要一个线程,那就使用一个线程。
在一个只有一个核心的小CPU上,最好的策略可能是在启动async|deferred任务时立即在同一线程中运行它。如果您要运行四个任务,效果将是一个接一个地运行它们。但在高端CPU上,它可以同时运行所有四个CPU,从而节省时间。
https://stackoverflow.com/questions/63164245
复制相似问题