首页 > 解决方案 > _writeBarrier() 的弃用

问题描述

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

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

这源于以下代码块:

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

我对 _writebarrier 的理解非常有限,但我相信该内在函数的目的是确保在多线程环境中,编译器不会试图“聪明”地优化代码并最终允许其他线程无意中使用了 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”内存顺序选项,但我不确定。

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

标签: c++multithreadingvisual-c++memory-barriersstdatomic

解决方案


理想情况下,您可以从手动滚动原子volatile转换为使用atomic<int> *pwith否则,就原子线程栅栏p->store(newval, std::memory_order_release); 之间的交互而言,您将受编译器的支配。volatile

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


推荐阅读