代码之家  ›  专栏  ›  技术社区  ›  David X

具有易失性和非易失性成员的联合的语义是什么?

  •  0
  • David X  · 技术社区  · 15 年前

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

    如果我不能进入第一个 sizeof(int) 项目 data ,我可以信赖吗 bits 按预期工作?

    2 回复  |  直到 13 年前
        1
  •  3
  •   kmalmur    15 年前

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

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

        2
  •  0
  •   R.. GitHub STOP HELPING ICE    15 年前

    volatile 绝对不会 用于实现锁。我说的不仅仅是理论上的;它 失败和你 有竞争条件,即使在单cpu/单核环境中也是如此。生成真正的原子锁原语的唯一方法是使用cpu的锁原语(对于x86,是锁前缀)编写程序集。

    事实上,也许有一种方法可以通过 不稳定的 O(n) 空间在哪里 n 是线程数,如果事先不知道可能的线程数,那么它将非常无用。

    推荐文章