C ++在两个线程上读/写64位,没有互斥/锁/原子

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

我有一个64位结构的std::array,每个结构如下:

MyStruct
{
    float _a{0};
    float _b{0};
};  // Assume packed

一个线程(CPU内核)将写入64位对象,第二个线程(不同的内核)将读取它。

我正在使用英特尔x86架构,并且我知道从英特尔开发人员手册中可以保证64位写入是原子的。

但是,我担心第二个线程可能会将值缓存在寄存器中,而无法检测到何时值已更改。

  • MESIF协议将确保第二个线程看到写入吗?
  • 我是否需要volatile关键字来告诉编译器另一个线程可能正在修改内存?
  • 我需要原子吗?

写值的线程对性能非常敏感,如果可以的话,我想避免内存障碍,互斥锁等。

c++ multithreading performance optimization cpu
1个回答
1
投票

Will the MESIF protocol guarantee the second thread sees the writes?

不,这取决于操作系统,如果您的第一个线程(写线程)被确定优先级并且设法在第二个线程甚至可以读取第一个线程之前写两次,则这是数据争用并且完全依赖于操作系统。

Do I need the volatile keyword to tell the compiler another thread might be modifying the memory?

volatile告诉编译器不要优化变量away,不要完全不优化变量。

Do I need atomics?

取决于,您不打算使用互斥体,您不打算使用任何与远程并发相关的东西,除了原子以外,原子更适合跨线程writing

我建议结合使用std :: mutex和std :: lock_guard或std :: scoped_lock。

我知道您的标题说您不想要它,但这实际上是保证每次阅读和写作的顺序相同的唯一方法。

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