线程间简单变量的最快安全通信?

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

Stack Overflow 上有类似标题的问题,但它们与我要问(和不问)的问题之间存在重大差异:见下文粗体字。

说我有一个耗时的计算。我们想要尽可能快的计算并且不介意有多个 CPU 核心在旋转。我创建一个worker线程,把一半的计算任务交给worker。

主线程设置一个输入变量供worker读取,然后将worker的输出变量设置为某个哨兵值。

工作线程自旋等待其输出设置为哨兵,然后读取输入,进行计算,并用实际输出覆盖哨兵。

与此同时,主线程进行了一半的计算,然后自旋等待输出从它写入的标记值变为任何其他值。

没有竞争条件是可能的,因为只有 main 将输出变量设置为哨兵,并且只有在非哨兵时才会这样做。只有 worker 将输出变量设置为非哨兵,并且只有在它是哨兵时才这样做。

要结束子线程,主线程设置一个bool标志让worker退出,然后设置输出变量为sentinel。工作人员看到哨兵,检查退出标志,然后退出而不是进行计算。

我已将输入、输出和退出标志变量全部设为原子<>。

问题是:这是在线程之间传递诸如 double 和 bool 之类的变量的最快可靠方法吗? 尤其是我实际上需要使所有输入、输出和标志成为原子?该软件在数亿次执行中正确运行 without atomic anything,但我怀疑这三个确实应该是原子的。在现代英特尔 CPU 上有更快的方法吗?我特别担心对缓存行的有害副作用:我应该确保正在旋转的变量在它们自己的缓存行上吗?

(此外,问题不是:旋转线程是否浪费,这是通用软件的良好通用解决方案吗,教科书是这样做的吗,是否有更通用的方法来协调线程等。 )

c++ multithreading c++20 atomic
© www.soinside.com 2019 - 2024. All rights reserved.