带有自动(启动::async |启动::延迟)启动策略的std::async的语义是什么



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

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

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

当您想使用对系统最有利的东西时,请使用默认值。

您永远不应该假设future在另一个线程上执行。只将其用于足够独立的代码,以便在执行时无关紧要。也许这是我个人的偏好,但我认为如果不这样做,就会产生讨厌的代码。如果你真的需要一个线程,那么就用一个线程。

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

最新更新