多核多線程對int,float等類型的讀原子性

x86和x64中,從彙編的角度看,

對任何內存地址中的1byte的讀永遠是原子的.也就是說對一個char的讀取永遠是原子的

對內存地址對齊2byte的int16類型的讀取是原子的,對4byte對齊的int32類型讀取是原子的,

從奔騰開始,對8byte對齊地址的int64讀取是原子的.


在x86下,malloc出來的內存均爲8byte對齊的,在x64下則是16byte對齊,棧上也是按照類型的對齊方式創建實例的,因此理論上說能

保證1-8byte對齊的數據讀寫是原子性的,但最好不要這樣,因爲C和C++均不保證一個變量的讀取必須用一條彙編指令完成,

2是有時候我們會把一個未對齊的內存地址強制轉型成其他類型(這樣做很危險但很多人在這樣做),例如:


char data[8];
int* k=(int*)&char[1];
*k=1;//此處無法保證*k按照4byte對齊

因此,最好認爲讀寫內存均不是原子的.如果有這種需求,最好使用atomic庫.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章