簡體   English   中英

使用gcc以32位模式對64位值進行原子讀/寫

[英]Atomic reads/writes of 64 bit values in 32 bit mode with gcc

在gcc中,是否有任何內在的或其他方式說服它執行原子的64位讀取和寫入,而不是2個32位寫入? (至少在一兩個地方)。

目前,我必須執行__sync_lock_test_and_set__sync_fetch_and_add才能進行原子讀取/寫入,但是有問題的CPU具有64位讀取和存儲指令。

我不希望編寫帶有#if的內聯匯編程序負載(大概每個要支持的CPU一個)。

我目前使用的是gcc 4.4.6,短期內不太可能進行升級。

如果使用“ long long”,則內存訪問將不是原子的。

但是,在使用64位CPU(甚至在32位程序中)時,“雙”內存訪問可能是原子的:

union {
    long long ll;
    double d;
} u;

u.ll = my_value;
*(double *)&my_long_long_variable = u.d;

但是,如果此示例中的數字“ my_value”將導致ud的“ signaling NaN”值,則以這種方式進行操作時可能會出現異常!

也許編譯器甚至不會為該代碼使用FPU寄存器。 在這種情況下,內存訪問將不是原子的,並且需要匯編程序編程。 您絕對需要使用FPU寄存器或XMM / MMX / ...寄存器來進行原子64位訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM