2012-03-13 56 views
1

我想以原子方式增加內聯彙編中的64位(C++中的長類型)計數器。我知道如何做到這一點在32位值(INT):內聯彙編程序增量64位計數器

asm volatile("lock; incl %0" : "=m" (val) : "m"(val)); 

但我不知道如何執行長期價值。

+2

32位或64位代碼? – 2012-03-13 01:36:07

+0

併爲什麼CPU?有些人有[cmpxchg8b](http://www.niallryan.com/node/137),但不是全部。 – 2012-03-13 02:05:51

+0

icore7-avx 64位代碼 – Dejwi 2012-03-13 02:10:42

回答

2

移動自回答這個問題一個答案

這是很容易的,但我還沒有熟悉的x86-64。

asm volatile("lock; incq %0" : "=m" (val) : "m"(val)); 
0

即應該是:

asm volatile("lock; incq %0" : "+m" (val)); 

指定獨立的操作數而不迫使輸入到相同的位置約束的輸出可能導致代碼如:

val = something; 
asm volatile("lock; incq %0" : "=m" (val) : "m"(val)); 

被錯誤地優化。您可能還需要一個內存clobber來防止訪問其他變量被移動通過asm。