你能举一个简单的或真实的例子来演示 volatile 复制构造函数的用法吗?
我就是想不出一个。
正如@Nawaz 已经指出的那样:
当你有 volatile 对象时,你需要 volatile copy-ctor。所以问题归结为:什么时候需要 volatile 对象?
使用 volatile 关键字的主要原因通常是禁用优化。也就是说,如果你有这样的东西:
bool flag = false;
if(!flag) {}
编译器将看到标志无法更改,因此无需每次都检查标志 - 所以不会。但是,如果您使标志变量 volatile - 它会。
以下是对 volatile 关键字原始使用的看法:link
简而言之,它最初是用来通过MMIO访问硬件的,这可能有点不寻常:
unsigned char* pControl = 0xff24 ;
*pControl = 0 ;
*pControl = 0 ;
*pControl = 0 ;
而且您不希望这 3 个任务由于优化而成为一个。
这是 Andrei Alexandrescu 关于多线程软件中易失性的论文:链接
有一些论文批评亚历山德雷斯库的论文,但我找不到。关键是他正在抛弃不稳定的财产等等。
请注意@JanHudec 指出的关于多线程的非常重要的事情:
volatile
对于多线程上下文完全没用,因为虽然它阻止了优化,但它不会产生显式障碍。如果没有在一个 CPU 上完成的写入,另一个 CPU 可能无法看到(取决于架构;x86 具有连贯的缓存,因此写入总是在那里可见)。也不
volatile
强制操作是原子的。在 x86 上分配始终是原子的,但并非所有 CPU 架构都是如此。而像增量这样更复杂的操作只能使用std::atomic
.