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