2014-03-29 99 views
0

在Intel x86處理器上,是否可以在特定內存位置比較一個值與另一個值,如果比較成功就重置內存而不必擔心多線程/處理器問題?我看到指令CMPXCHG - 是否可以工作?還是有一些比較和設置的用例?用於比較和重置內存的Intel x86彙編

回答

0

A compare-and-setcompare-and-swap的變種,您可以在此獲得存儲器位置數據是否與給定值相匹配的真/假指示,以及存儲器位置是否已更新。 compare-and-swap的替代方案是您從內存中讀取內容,並且可以自己與給定值進行比較。

http://en.wikipedia.org/wiki/Compare-and-swap

的CMPXCHG指令實際上是一個compare-and-set指令。如果存儲器中的值與EAX中給出的值匹配(隱式寄存器),則置位零標誌(EFLAGS.ZF),此時源操作數(明確寄存器)中的值存儲在存儲器中。要成爲一個compare-and-swap指令將要求指令從內存中,比較與EAX,到目標存儲和到源寄存器,這將是不自然的,甚至對於X86是CISC看齊卓越

您必須使用LOCK前綴來確保CMPXCHG以原子方式執行,也就是說,執行CMPXCHG的線程可以讀取,然後在任何其他線程訪問之前寫入內存位置。

你說resetting the memory if the compare succeeded如果你的意思是將內存位置設置爲零,那麼零是你想要在源寄存器中的值。

對於做compare-and-swap的便攜方式見資源this SO question

注意的CMPXCHG指令允許目標操作數是寄存器和存儲器位置。測試8個字節時,您可以使用CMPXCHG8B指令。在CMPXCHG8B指令中指定LOCK前綴並指定寄存器作爲目的地時,Pentium處理器中存在一個錯誤,您可以閱讀更多關於它的信息here