シリアルコードでは、最大値の更新は次のように簡単に実行できます。
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>
)。