2013-04-16 9 views
11

C++ 11のCAS操作(例えば、atomic_compare_exchange_weakatomic_compare_exchange_strong)の多くは、このような二つのポインタと値、すなわち、取りますすべて1つのポインタと2つの値を取る:なぜC++ 11 CASオペレーションは2つのポインタパラメータを取るのですか?これとは対照的に</p> <pre><code>bool atomic_compare_exchange(T* pointer, T* expected, // pseudodeclaration! T desired); </code></pre> <p>、CAS操作マイクロソフト、GCC、およびインテルから:

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

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

はなぜC++ 11のCAS機能は、二つのポインタ、代わりに、より従来のポインタ2つの値と思われるものの値を取るのですか?

+0

'__sync_boolは_...' * BOOL *返します。 –

+1

@KerrekSB:私がインテルのマニュアルをコピーしたことを示した署名。私はgccが同じ署名を使用していると仮定しました。私は今それがそうでないことを見る。 – KnowItAllWannabe

答えて

18

交換が失敗した場合、*expectedであり、新しい現在の値にを更新しました。マイクロソフトの署名で

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

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

、操作が成功したかどうかをテストすることはGCCの__sync_typeバージョンのためのより多くの面倒、と同上である:それは、ループ内の関数を使用することが容易になります。 GCCの__sync_boolでは、交換が失敗するたびに別の負荷を実行する必要があります。

2

私はあなたが両方を持っていない理由は分かりません。私の使用事例では、C++バージョンはそれほど有用ではありません。私は、変数がある値を持つまで待ってから、新しい値に設定したいと思っています。 C++ 11と

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

:GCCのinstrinsicsで

auto tmp = expected; 
while (!value.compare_exchange_weak(tmp,desired)) 
{ 
    tmp = expected; 
} 
関連する問題