C++ std::async(std::launch::async...) 执行的任务可以在线程之间切换/窃取吗?

问题描述 投票:0回答:1

在 Windows 上的 C++ 中,给定一个由

std::async(std::launch::async, ...)
启动的任务,它是否可以首先由一个线程执行,然后在可能的上下文切换后,被另一个线程窃取并执行?

例如,如果我在任务中创建了一些

thread_local
变量,它们会被保留吗?

这个疑问是由我同事的评论引起的,他读了这一段

c++ threadpool stdasync
1个回答
0
投票

可以先由一个线程执行,然后[稍后]由另一个线程执行吗?

是的,可以,但仅限于特定场景。

如果您的任务只执行同步计算(例如,计算素数),它将在启动时分配给它的线程中完整执行。

但是:

如果您的任务在同步计算中还执行一些等待其他异步操作的结果的操作,则该任务的部分内容可能会在不同的线程上运行。 一般来说,任何时候任务等待异步操作完成时,它都会被放置在等待列表中,并且其线程可以自由地用于运行其他任务。 当等待结束时,一个线程被分配给该任务,以便该任务可以恢复运行,但您可能不希望该线程与原始线程相同。 很可能,它不会相同。

© www.soinside.com 2019 - 2024. All rights reserved.