我已经陷入了一个混乱的混乱的多线程编程混乱,并希望有人能来和我巴掌一些理解。原子64位写入GCC
经过相当多的阅读后,我已经了解到,我应该能够在64位系统上自动设置一个64位整数值的值。
虽然我发现很多这种阅读困难,所以我想尝试做一个测试来验证这一点。所以我写了一个线程一个简单的程序,将设置一个变量为两个值中的一个:
bool switcher = false;
while(true)
{
if (switcher)
foo = a;
else
foo = b;
switcher = !switcher;
}
而另一个线程这将检查foo
值:
while (true)
{
__uint64_t blah = foo;
if ((blah != a) && (blah != b))
{
cout << "Not atomic! " << blah << endl;
}
}
我设置a = 1844674407370955161;
和b = 1144644202170355111;
。我运行这个程序,并得到没有输出警告我,blah
不是a
或b
。
大,看起来可能是原子写入......但后来,我改变了第一个线程设置a
和b
直接,就像这样:
bool switcher = false;
while(true)
{
if (switcher)
foo = 1844674407370955161;
else
foo = 1144644202170355111;
switcher = !switcher;
}
我重新运行,突然:
Not atomic! 1144644203261303193
Not atomic! 1844674406280007079
Not atomic! 1144644203261303193
Not atomic! 1844674406280007079
发生了什么变化?无论哪种方式,我分配一个很大的数字foo
- 编译器处理一个常数不同,或我误解了一切?
谢谢!
1: Intel CPU documentation, section 8.1, Guaranteed Atomic Operations
编译时是否收到任何警告? – Nim 2011-03-10 11:00:35
我不认为它是罪魁祸首,但默认情况下,文字具有int类型,所以您希望1844674407370955161ULL和1144644202170355111ULL为文字。 – etarion 2011-03-10 11:00:59
Nim,编译时没有警告,并且设置了-Wall – Frederik 2011-03-10 11:06:11