我最近升级了我正在开发的 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> *p
与 p->store(newval, std::memory_order_release);
否则,就 volatile
之间的交互而言,您将受到编译器的摆布。和原子线程栅栏。
我猜atomic_thread_fence(std::memory_order_release)
应该可以在现有编译器上正常工作,将带有 volatile 的手动宽松存储放入发布存储中。
关于c++ - 弃用 _writeBarrier(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60257684/