为什么在 C++20 中弃用了 volatile?
Why is volatile deprecated in C++20?
根据 cppreference,大多数 volatile
关键字的使用将在 C++20 中弃用。 volatile
的缺点是什么?不使用 volatile
时的替代解决方案是什么?
C++ committee language evolution chair 就原因进行了很好的讨论。
简要总结,volatile
被删除的地方在标准中没有任何明确定义的含义,只是造成了混淆。
激励(模棱两可)的例子
- 易失性位字段应由您的硬件手册and/or编译器指定。
+=
是single/atomic指令吗? ++
怎么样?
compare_exchange
需要多少 reads/writes?如果失败了怎么办?
void foo(int volatile n)
是什么意思?或 int volatile foo()
?
- 应该
*vp;
加载吗? (这在标准中已更改两次。)
线程
历史上,人们使用 volatile
在 C 和 C++ 中实现线程安全。在 C++11 中,添加了在线程之间创建同步和共享状态的非 UB 方法。我推荐 Back to Basics: Concurrency 作为一个很好的介绍。
根据 cppreference,大多数 volatile
关键字的使用将在 C++20 中弃用。 volatile
的缺点是什么?不使用 volatile
时的替代解决方案是什么?
C++ committee language evolution chair 就原因进行了很好的讨论。
简要总结,volatile
被删除的地方在标准中没有任何明确定义的含义,只是造成了混淆。
激励(模棱两可)的例子
- 易失性位字段应由您的硬件手册and/or编译器指定。
+=
是single/atomic指令吗?++
怎么样?compare_exchange
需要多少 reads/writes?如果失败了怎么办?void foo(int volatile n)
是什么意思?或int volatile foo()
?- 应该
*vp;
加载吗? (这在标准中已更改两次。)
线程
历史上,人们使用 volatile
在 C 和 C++ 中实现线程安全。在 C++11 中,添加了在线程之间创建同步和共享状态的非 UB 方法。我推荐 Back to Basics: Concurrency 作为一个很好的介绍。