具有易变和非易失成员的工会的语义是什么?

时间:2010-07-28 05:59:08

标签: c volatile unions

更具体地说,我有(简化)以下内容:

union foo
    {
    volatile int bits;
    char data[sizeof(int)*CHAR_BIT];
    }

如果我从未访问sizeof(int)的第一个data项,我可以依靠bits按预期工作吗?

2 个答案:

答案 0 :(得分:3)

基本上将结构的一个字段标记为volatile是正确的。但你必须记住volatile关键字的作用。它告诉编译器不要优化对变量的访问。始终从内存中读取值,而不是从寄存器中的副本中读取值。

当您在评论中写道时,您正在尝试使内存分配线程安全。不幸的是,volatile并不能保证您可以从多个线程访问它。如果您使用的是8位CPU,则访问整数值不是原子操作,因此您的程序将无法正常工作。

答案 1 :(得分:0)

volatile 绝不对实现锁定有用。我不是在理论上说话;即使在单CPU /单核环境中,失败并且 会有竞争条件。制作真正的原子锁原语的唯一方法是使用cpu的锁定原语编写汇编(对于x86,锁前缀)。

实际上,可能有一种方法只用volatile来实现,但我所知道的唯一这样的锁定机制需要O(n)空间,其中n是线程数,这使得如果事先不知道可能的线程数,那就没用了。