c++ - 弃用 _writeBarrier()

标签 c++ multithreading visual-c++ memory-barriers stdatomic

我最近升级了我正在开发的 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 从手卷原子进行转换使用atomic<int> *pp->store(newval, std::memory_order_release);否则,就 volatile 之间的交互而言,您将受到编译器的摆布。和原子线程栅栏。

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

关于c++ - 弃用 _writeBarrier(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60257684/

相关文章:

c++ - 默认参数,gcc vs clang

c++ - 运算符在类内与类外重载

c++ - Qt 中的 OpenGL 不绘制红色方 block

c++ - Arduino 在启动时自动运行代码

c++ - 检查所有使用的 OpenGL 扩展

Java - 信号量的广泛使用

multithreading - 多线程依赖于机器的架构吗?

python - 在长时间运行的进程中重新加载全局Python变量

c++ - 给定一个指向 C++ 对象的指针,调用 operator[] 函数的所有正确方法是什么?

C++数组问题