更具体地说,我有(简化)以下内容:
union foo
{
volatile int bits;
char data[sizeof(int)*CHAR_BIT];
}
如果我从不访问 的第一sizeof(int)
项data
,我可以依靠bits
按预期工作吗?
基本上将结构的一个字段标记为 volatile 是正确的。但是你必须记住 volatile 关键字的作用。它告诉编译器不要优化对变量的访问。值总是从内存中读取,而不是从寄存器中的副本中读取。
正如您在评论中所写,您正在尝试使内存分配线程安全。不幸的是, volatile 不能保证您可以从多个线程访问它。如果您使用 8 位 CPU,访问整数值不是原子操作,因此您的程序将无法正常工作。
volatile
对实现锁毫无用处。我说的不仅仅是理论上;即使在单 CPU/单核环境中,它也会失败并且您将遇到竞争条件。制作真正的原子锁定原语的唯一方法是使用 cpu 的锁定原语(对于 x86,锁定前缀)编写程序集。
实际上,可能有一种方法可以解决问题,volatile
但我所知道的唯一这样的锁定机制会占用线程数的O(n)
空间,n
如果事先不知道可能的线程数,这将变得毫无用处。