弃用 _writeBarrier()

Deprecation of _writeBarrier()

我最近升级了 visual studio (2019) 的版本,我正在处理并重新编译由以前的开发人员编写的相当旧的代码库。我在编译期间遇到以下问题:

C3861:“_WriteBarrier”:未找到标识符

这源自以下代码块:

inline void SetValueWithRelease(volatile unsigned int* p, int newval)
{ *p = newval; _WriteBarrier(); }

我对 _writebarrier 的理解非常有限,但我相信该内在函数的目的是确保在多线程环境中,编译器不会试图 "clever" 优化代码并最终允许其他线程无意中使用 p.

的未实例化版本

但至于解决这个弃用问题,根据我的阅读,我最好的选择是使用 atomic_thread_fence: https://docs.microsoft.com/en-us/cpp/standard-library/atomic-functions?view=vs-2019#atomic_thread_fence

假设这是正确的,我倾向于在此函数中使用 "memory_order_seq_cst" 内存顺序选项,但我不确定。

如有任何意见或指导,我将不胜感激。

理想情况下,您可以将使用 volatile 的手动原子转换为使用 atomic<int> *pp->store(newval, std::memory_order_release); 否则,就 [=] 之间的交互而言,您将受制于编译器10=] 和原子线程栅栏。

我猜 atomic_thread_fence(std::memory_order_release) 应该可以在现有编译器上正常工作,将带有 volatile 的手动轻松存储放入发布存储中。