Deprecation of _writeBarrier()

Deprecation of _writeBarrier()

本文关键字:writeBarrier of Deprecation      更新时间:2023-10-16

我最近升级了Visual Studio(2019(的版本,我正在研究并重新编译由以前的开发人员编写的相当旧的代码库。我在编译过程中遇到以下问题:

C3861:"_WriteBarrier":找不到标识符

这源自以下代码块:

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

我对_writebarrier的理解非常有限,但我相信该内在的目的是确保在多线程环境中,编译器不会试图"聪明"地优化代码,最终允许其他线程无意中使用未实例化的 p 版本。

但是至于克服这个弃用问题,从我所读到的内容来看,我最好的选择是使用 atomic_thread_fence: https://learn.microsoft.com/en-us/cpp/standard-library/atomic-functions?view=vs-2019#atomic_thread_fence

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

我将不胜感激任何输入或方向以明确解释。

理想情况下,您可以从带有volatile的手动卷制原子转换为使用带有p->store(newval, std::memory_order_release);atomic<int> *p否则,就volatile和原子线程围栏之间的交互而言,您将受到编译器的摆布。

我想atomic_thread_fence(std::memory_order_release)应该在现有的编译器上正常工作,以将易失性的手动滚动放松存储变成发布存储。