2010-07-27 15 views
6

I artırmak parçacığı güvenli bir değer LOCK kullanımı nasıl:Bir değeri okumak için LOCK ASM önekini nasıl kullanırım?

lock inc  [J]; 

Ama okuma nasıl [J] (ya da herhangi bir değer) evreli bir şekilde? LOCK öneki, mov ile kullanılamaz. Yaparsam Ve aşağıdaki:

xor eax, eax; 
    lock add eax, [J]; 
    mov [JC], eax; 

Yolun 2.

+0

Buraya ulaşmaya çalıştığınız şey nedir? – Iridium

+0

Tüm yapmak istediğim, [J] 'yi dişli olarak güvenli bir şekilde okumak. – IamIC

cevap

9

Kullanım XADD veya MOV komutu bir hata yükseltir yerine talimat ADD! Ayrıca bkz. MFENCE, LFENCE ve SFENCE talimatları!

DÜZENLEME: Kaynak işleneni bir bellek işlenen ise LOCK komutunu ADD yönergesi ile kullanamazsınız!

Gönderen: "Intel® 64 ve IA-32 ArchitecturesSoftware Geliştirici Kılavuzu"

KİLİDİ ​​önek yalnızca talimatlar bu formlara aşağıdaki talimatlara ve sadece önüne alınabilir hedef işlenen , BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, dEĞİL, YA, SBB, SUB, XOR, XADD ve xchg, ADD ADC vE: bir bellek işlenendir. LOCK öneki ile birlikte bu talimatlardan biri ve kaynak işleneni bir bellek işleneni ise, tanımsız opcode özel durumu (#UD) üretilebilir. Tanımlanmamış bir opcode istisnası, LOCK ön ekinin yukarıdaki listede bulunmayan herhangi bir talimatı ile kullanılması halinde de oluşturulacaktır. Formu: "Intel® 64 ve IA-32 ArchitecturesSoftware Geliştirici Kılavuzu, Volume3A"

XCHG talimat bakılmaksızın her zaman KİLİDİ ​​öneki

EDIT2 ait varlığı ya da yokluğunun KİLİDİ ​​# sinyalini iddia

8.1.1 Garantili Atomik İşlemler.

  • okuma veya bir byte
  • okuma yazma ya da bir kelime ile hizalanmış yazma: Intel486 işlemci (ve daha yeni işlemciler için) aşağıdaki temel bellek işlemleri her atomik gerçekleştirilecektir garanti 16 bit sınır
  • okuma veya 32 bitlik bir sınır

Pentium işlemci ile hizalanmış bir doubleword yazma: (a nd yeni işlemciler beri) ek bellek işlemleri aşağıdaki hep atomik yapılacaktır garanti:

  • okuma veya 64-bit sınırında hizalanmış bir quadword yazma
  • 6 bitlik önbelleğe alınmamış belleğe erişir 32 bit
    veri yolu sığacak yerleri (beri ve daha yeni işlemciler) P6 ailesi işlemciler

    garanti aşağıdaki
    ek bellek operasyonolacak o hep atomik gerçekleştirilmelidir:
  • Hizalanmamış 16-, 32- ve 64-bit

bölünmüş karşısındadır önbelleklenebilir belleğe erişir bir önbellek hattı içinde
sığacak önbelleğe belleğe erişir otobüs genişlikleri, önbellek hatları, ve sayfa sınırları
Intel Core 2 Duo, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, P6 ailesi, Pentium tarafından atomik olmak garantili ve Intel486 işlemciler değildir. Intel Core 2 Duo , Intel Core Duo, Pentium M, Pentium 4, Intel Xeon ve P6 ailesi işlemciler bölünmüş atomik erişen harici bellek alt sistemleri izin otobüsü kontrol sinyallerinin yapmak sağlamak; Ancak, , erişilemeyen veri erişimleri işlemcisini işlemcinin performansını ciddi şekilde etkiler ve bundan kaçınılmalıdır. writting için

LOCK  CMPXCHG EAX, [J] 

:

Yani, okuma için ben gibi KİLİDİ ​​önek ile CMPXCHG talimat kullanmak prefare

MOV [J], EAX 
SFENSE 

.

+0

Complier, 2. satırı derlemeyi reddediyor. xadd eax, dword ptr J; çalışmıyor. – IamIC

+0

Evet, nedeni kaynak işleneninin bir bellek işleneni olmasıdır! –

+0

Niçin derlenmeyeceği konusundaki açıklama için teşekkürler. Bu yüzden ya eskrim talimatlarını kullanmak zorundayım, ya da sadece okunan işlenmeden beri, iplik-güvenlik açısından sorun teşkil etmeyecek olan değerin anlık görüntüsünü yapmak istiyorum: mov eax, [ J]; mov [JSnapshot], eax; – IamIC

İlgili konular