在x86-64
機器上,int64
的讀寫操作是否具有原子性?
假設變數val
是int64
, 現在有兩個執行緒,執行緒writer
只負責向val
寫入資料,執行緒reader
只負從val
讀取資料
假設val
當前值為0x0102030405060708
writer
執行緒正在執行寫操作,將資料0x0000111100002222
寫入val
reader
執行緒正在執行讀操作,從val
讀取資料
那麼reader
執行緒得到的val
只能是0x0102030405060708
或0x0000111100002222
還是某個不確定的中間狀態?
如果int64
的讀寫操作具有原子性,那麼reader
執行緒得到的只能是0x0102030405060708
或0x0000111100002222
如果int64
的讀寫操作不具有原子性,那麼reader
執行緒得到可能是中間某個不確定的狀態,比如前一半是writer
正在寫入的資料,後一半是舊的資料0x0000111105060708
測試程式如下:
寫入val
的值一定是符合奇偶校驗的
開啟10
個執行緒同時向val
輸入資料
讀執行緒連續的從val
讀取資料,並檢查是否符合奇偶校驗
如果int64
的讀寫操作具備原子性,讀執行緒得到的資料一定是符合奇偶校驗的
測試發現,在x86 64
機器上,int64
的讀寫操作確實具備原子性
package main
import
("log"
"math/rand"
"sync"
)func
check
(v int64
)bool
v = v >>1}
return num%2==
0}func
write
(p *
int64
)*p = v
}func
main()
}()}
gofunc()
}}()
wg.wait()
log.
printf
("test finished"
)}
int64型別的使用
int型別範圍為 2 31,2 31 即 2147483648 2147483647,unsigned型別範圍為 0,2 32 即0 2147483648,當需要表示的整數小於10位時可以使用。當需要表示的整數大於10位時,使用int型別將會出現溢位,此時可以使用 int64型別。int64型別範圍...
關於 int64型別使用的一點感受
今天要生成乙個20g的單詞檔案,遇到資料邊界的問題,這裡記下。要生成這個20g的檔案,我首先從乙個檔案裡面讀取了一定量的單詞,放在緩衝區裡面,然後重複把這個緩衝區寫入檔案。這裡我需要計算出迴圈的次數,如果這麼寫 int64 k 20 20gb的檔案需要迴圈的次數 k 20 1024 1024 102...
自動化測試 五 讀寫64位作業系統的登錄檔
非web程式 桌面程式 的設定一般都存在登錄檔中。給這些程式做自動化測試時,需要經常要跟登錄檔打交道。通過修改登錄檔來修改程式的設定。本章介紹如何利用c 程式如何操作登錄檔,特別是如何操作64位作業系統的登錄檔。很多系統的設定 比如 ie的設定 都是存在登錄檔中。桌面應用程式的設定也是存在登錄檔中。...