我已經陷入了一個混亂的混亂的多線程編程混亂,並希望有人能來和我巴掌一些理解。原子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