2013-04-16 20 views
11

C++ 11 CAS operasyonları (örneğin atomic_compare_exchange_weak, atomic_compare_exchange_strong) böyle, yani iki işaretçiler ve bir değer, almak çoğu: Buna karşılıkNeden C++ 11 CAS işlemleri iki işaretçi parametresi alır?

bool atomic_compare_exchange(T* pointer, T* expected,  // pseudodeclaration! 
          T desired); 

, Microsoft, gcc ve Intel'den CAS işlemleri

long InterlockedCompareExchange(long* pointer, long desired,  // Microsoft 
           long expected); 

int __sync_bool_compare_and_swap (T* pointer, T expected,   // gcc and 
            T desired);      // Intel 

Neden C++ 11 CAS fonksiyonları iki işaretçiler almak ve bunun yerine görünen bir değeri daha geleneksel bir işaretçi ve iki değeri olması: her bir işaretçi ve iki değeri alır?

+0

'__sync_bool _... '* a * bool döndürür. –

+1

@KerrekSB: Gösterdiğim imza, Intel el kitabından kopyalandım. Gcc'in aynı imzayı kullandığını farz ettim. Şimdi bunun olmadığını görüyorum. – KnowItAllWannabe

cevap

18

C++ 11 yolu daha kullanışlıdır: Değişim başarısız olursa, *expectedyeni geçerli değere güncelleştirilmiştir. Yani kolay bir döngüde işlevini kullanmayı kolaylaştırır:

T value = x.load(); 
T newvalue = frob(value); 

while (!atomic_compare_exchange(&x, &value, newvalue)) 
{ 
    newvalue = frob(value); 
} 

Microsoft imzası ile, operasyon GCC en __sync_type sürümü için daha hantal ve aynen olduğu başarılı olup olmadığını test etmek. GCC'nin __sync_bool ile, değişim her başarısız olduğunda başka bir yük yapmanız bile gerekir.

2

Neden olmasa da neden görmedim. Benim kullanımda C++ sürümü daha az kullanışlıdır. Bir değişkenin bir değeri olana kadar beklemek istiyorum, sonra yeni bir değere ayarlamak istiyorum. GCC instrinsics ile

:

while (!__sync_bool_compare_and_swap(&value, expected, desired)) { } 

11 C++ olarak:

auto tmp = expected; 
while (!value.compare_exchange_weak(tmp,desired)) 
{ 
    tmp = expected; 
} 
İlgili konular