InterlockedRead在哪里?

19 winapi multithreading interlocked

Win32 api有一组InterlockedXXX函数可以原子地和同步地操作简单变量,但是似乎没有任何InterlockedRead函数可以简单地检索变量的值.怎么会?

MSDN说:

对正确对齐的32位变量的简单读取和写入是原子操作

但补充说:

但是,不保证访问同步.但是,不保证访问同步.如果两个线程正在从同一个变量读取和写入,则无法确定一个线程是否会在另一个线程执行其写入操作之前执行其读取操作.

这意味着,据我所知,变量的简单读取操作可以发生,而另一个,例如,InterlockedAdd操作就位.那么为什么没有互锁函数来读取变量呢?

我猜这个值可以作为InterlockedAdd-zero的结果读取,但这似乎不是正确的方法.

Jon*_*eet 8

实现这一点的常规方法是使用比较交换操作(例如InterlockedCompareExchange64),其中两个值都相同.我有一种潜在的怀疑,由于某些原因,这可以比添加0更有效地执行,但我没有证据支持这一点.

有趣的是,.NET的Interlocked类在Read.NET 2.0之前没有获得方法.我相信这Interlocked.Read是使用Interlocked.CompareExchange.(请注意,文档对Interlocked.Read我来说有点误导 - 它谈论原子性,但不是波动性,这意味着.NET上非常具体的东西.我不确定Win32内存模型保证了从不同的新写入值的可见性线程,如果有的话.)


zvr*_*rba 7

我认为你对"不同步"的解释是错误的.简单读取原子的,但您必须自己处理重新排序和内存可见性问题.前者通过在适当的位置使用fence指令来处理,后者在读取时没有问题(但是潜在的并发写入必须确保适当的可见性,如果它们映射到LOCKED asm指令,则Interlocked函数应该执行此操作).