0

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

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

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

4

2 回答 2

3

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

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

于 2010-07-28T06:34:21.683 回答
0

volatile对实现锁毫无用处我说的不仅仅是理论上;即使在单 CPU/单核环境中,它也会失败并且您将遇到竞争条件。制作真正的原子锁定原语的唯一方法是使用 cpu 的锁定原语(对于 x86,锁定前缀)编写程序集。

实际上,可能有一种方法可以解决问题,volatile但我所知道的唯一这样的锁定机制会占用线程数的O(n)空间,n如果事先不知道可能的线程数,这将变得毫无用处。

于 2010-07-28T11:46:48.873 回答