c++ - _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”内存顺序选项,但我不确定。
我将不胜感激任何输入或方向来明确解释。
解决方案
理想情况下,您可以从手动滚动原子volatile
转换为使用atomic<int> *p
with否则,就原子线程栅栏p->store(newval, std::memory_order_release);
之间的交互而言,您将受编译器的支配。volatile
我猜想atomic_thread_fence(std::memory_order_release)
应该可以在现有编译器上正常工作,以将带有 volatile 的手动轻松存储转换为发布存储。
推荐阅读
- laravel-5 - 我如何使用 laravel Event Listner 在活动前发送邮件通知
- laravel - 安装 laravel 后无法运行 npm 命令
- javascript - Angular 7共享服务不共享
- r - 在 R 中的每个单元格中查找并提取句子中的年份
- go - 运行 go 测试,除了一个包
- r - 如何检查包中是否存在数据集?
- javascript - 引导模式在打开时被禁用
- angularjs - 带有 Express/Nodejs 的 Angular ngRoute 用于 SPA
- java - org.eclipse.core.runtime.CoreException:类文件不在类路径上
- c# - 尝试在 C# 脚本中删除文件时共享冲突