弃用 _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> *p
和 p->store(newval, std::memory_order_release);
否则,就 [=] 之间的交互而言,您将受制于编译器10=] 和原子线程栅栏。
我猜 atomic_thread_fence(std::memory_order_release)
应该可以在现有编译器上正常工作,将带有 volatile 的手动轻松存储放入发布存储中。
我最近升级了 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> *p
和 p->store(newval, std::memory_order_release);
否则,就 [=] 之间的交互而言,您将受制于编译器10=] 和原子线程栅栏。
我猜 atomic_thread_fence(std::memory_order_release)
应该可以在现有编译器上正常工作,将带有 volatile 的手动轻松存储放入发布存储中。