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