45

シリアルコードでは、最大値の更新は次のように簡単に実行できます。

template<typename T>
void update_maximum(T& maximum_value, T const& value) noexcept
{
  if(value > maximum_value) maximum_value = value;
}

atomic<T>ただし、最大値を保持する変数に対してこれを行うにはどうすればよいですか。

template<typename T>
void update_maximum(std::atomic<T>& maximum_value, T const& value) noexcept
{
   // want a lock-free, thread-safe implementation
}

maximum_valueロードとストアの間で別のスレッドが変更される可能性があるため、明らかに、シリアル バージョンのコードは機能しません。これを実装するためにcompare_exchange(==ではなく比較する ) を使用できますか? >どうやって?

明示的なロックは許可されていないことに注意してください (許可される唯一のロックは、 の実装に付属するものですstd::atomic<T>)。

4

1 に答える 1

49

単一の操作では不可能のようですが、最終的に成功するか、アトミック変数の値が よりも大きくなるまで、これを実行しようとするループを作成できますvalue

template<typename T>
void update_maximum(std::atomic<T>& maximum_value, T const& value) noexcept
{
    T prev_value = maximum_value;
    while(prev_value < value &&
            !maximum_value.compare_exchange_weak(prev_value, value))
        {}
}
于 2013-04-24T11:28:25.410 に答える