TL;DR: 我需要 Microsoft C (不是 C++) 的等同于 C11 的
我有一些使用原子操作的标准代码,类似于:
atomic_load
。有人知道正确的函数是什么吗?我有一些使用原子操作的标准代码,类似于:
do {
bar = atomic_load(&foo);
baz = some_stuff(bar);
} while (!atomic_compare_exchange_weak(&foo, &bar, baz));
我正在尝试使用MSVC处理它。CAS(InterlockedCompareExchange
)很容易,但atomic_load
似乎更麻烦。
也许我漏掉了什么,但是MSDN上的同步函数列表似乎没有任何关于简单加载的内容。我唯一能想到的是像InterlockedOr(object, 0)
这样的东西,这将为每次加载生成一个存储(更不用说栅栏了)...
只要变量是易失性的,我认为只需读取该值即可安全,但如果我这样做,Visual Studio的代码分析功能会发出一堆C28112警告(“通过Interlocked函数访问的变量(foo)必须始终通过Interlocked函数访问。”)。
如果简单读取确实是正确的方法,我认为我可以使用类似以下内容来消除这些警告:
#define atomic_load(object) \
__pragma(warning(push)) \
__pragma(warning(disable:28112)) \
(*(object)) \
__pragma(warning(pop))
但分析器坚持认为我应该始终使用Interlocked*
函数,这让我相信一定有更好的方法。如果是这样,那么是什么呢?
#define atomic_load(object) (*(object))
(这是我过去为MSVC所做的),但代码分析器让我有些犹豫。 - nemequ