int64的讀寫操作是否具有原子性質

2021-10-10 17:13:21 字數 1514 閱讀 7877

x86-64機器上,int64的讀寫操作是否具有原子性?

假設變數valint64, 現在有兩個執行緒,執行緒writer只負責向val寫入資料,執行緒reader只負從val讀取資料

假設val當前值為0x0102030405060708

writer執行緒正在執行寫操作,將資料0x0000111100002222寫入val

reader執行緒正在執行讀操作,從val讀取資料

那麼reader執行緒得到的val只能是0x01020304050607080x0000111100002222還是某個不確定的中間狀態?

如果int64的讀寫操作具有原子性,那麼reader執行緒得到的只能是0x01020304050607080x0000111100002222

如果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的設定 都是存在登錄檔中。桌面應用程式的設定也是存在登錄檔中。...