语境
我正在用 C++ 编写一个线程安全的原型线程/协程库,并且我正在使用原子来使任务切换无锁。我希望它尽可能高效。我对原子和无锁编程有一个大致的了解,但我没有足够的专业知识来优化我的代码。我做了很多研究,但很难找到我的具体问题的答案:不同内存顺序下不同原子操作的传播延迟/可见性是多少?
当前假设
我读到对内存的更改是从其他线程传播的,它们可能会变得可见:
- 对不同的观察者以不同的顺序,
- 有一些延迟。
我不确定这种延迟的可见性和不一致的传播是否仅适用于非原子读取,或者也适用于原子读取,这可能取决于使用的内存顺序。当我在 x86 机器上开发时,我无法测试弱排序系统上的行为。
无论操作类型和使用的内存顺序如何,所有原子读取是否总是读取最新值?
我很确定所有读取-修改-写入(RMW)操作总是读取任何线程写入的最新值,而不管使用的内存顺序如何。对于顺序一致的操作似乎也是如此,但前提是对变量的所有其他修改也是顺序一致的。据说两者都很慢,这对我的任务不利。如果不是所有原子读取都获得最新值,那么我将不得不使用 RMW 操作来读取原子变量的最新值,或者在 while 循环中使用原子读取,据我目前的理解。
写入的传播(忽略副作用)是否取决于内存顺序和使用的原子操作?
(这个问题只有在前一个问题的答案是并非所有原子读取总是读取最新值时才有意义。请仔细阅读,我不在这里询问副作用的可见性和传播。我只关心原子变量本身的值。)这意味着根据用于修改原子变量的操作,可以保证任何后续原子读取都接收到变量的最新值。因此,我必须在保证始终读取最新值的操作之间进行选择,或者使用宽松的原子读取,同时使用这种特殊的写入操作来保证对其他原子操作的修改的即时可见性。