2009-04-24 47 views
3

我想在x86平臺(Pentium或更高保證)上執行和原子讀取64b對齊的64b數據。如何在x86(Pentium及以上)上執行原子64b讀取?

有沒有辦法做到這一點? (不,我不想爲此使用臨界區或互斥鎖,我希望這是無鎖的)。

+0

請確認 - 你的意思是64位或字節? – Alnitak 2009-04-24 21:15:59

+1

我假設它是64位。字節不會真的有意義。 – Zifre 2009-04-24 21:18:07

+0

這個問題會更好,如果它在文本中提到Windows而不是隻有win32標記。我看到標籤幫助搜索,而不是信息本身。 – 2009-04-24 23:50:10

回答

4

使用互鎖操作,這裏的一些示例代碼:

LONGLONG AtomicRead(LONGLONG* p) 
{ 
    return InterlockedCompareExchange64(p, 0, 0); 
} 

這確實比較交流與零和集合P爲零,如果它已經等於零 - 即,它是一個空操作。 InterlockedCompareExchange返回由p指向的原始64位值。

+0

InterlockedAdd()添加0更好 - CAS有更多的工作要做,並佔用更多的週期。 – 2009-04-24 21:52:28

+1

根據MSDN,InterlockedAdd僅在Itanium上受支持。 即使在x86上,鎖定添加也只是一個32位讀取。 – Michael 2009-04-24 22:02:04

+0

我的意思是,InterlockedAdd64。 – Michael 2009-04-24 22:11:05

0

使用Interlocked *()函數。

有沒有讀本身 - 但你可以發出一個Add()在其中添加0.1

+1

爲什麼你認爲他在使用Windows? – Zifre 2009-04-24 21:27:06

+0

x86上沒有Interlocked Add或Or Xor,只有_InterlockedCompareExchange64 - 請參閱Zifre的回答 – Suma 2009-04-24 21:41:31

+1

該問題目前標記爲「win32」,因此我認爲可以安全地假定Windows函數可以接受。 – 2009-04-24 21:53:51

6

This page介紹如何做到這一點。基本上你只需要使用lock cmpxchg8b

+0

C++,而不是asm - 他希望操作系統提供包裝。 – 2009-04-24 21:18:19

+1

@Blank Xavier,你爲什麼認爲他希望OS提供包裝?你怎麼知道他使用的是什麼操作系統? – Zifre 2009-04-24 21:26:32

+0

C++標記。我不知道操作系統,所以我的聯鎖*()建議可能對他沒有用處。 – 2009-04-24 21:29:01

相關問題