During code review of my demo, reviewer suggested to use atomic_fetch_max compatible with the proposal Atomic maximum/minimum:
template<typename T>
T atomic_fetch_max(std::atomic<T>* obj, typename std::atomic<T>::value_type arg) noexcept
{
auto prev = *obj;
while (prev < arg && !obj->compare_exchange_weak(prev, arg)) {}
return prev;
}
instead of my code
template<typename T>
void update_max(std::atomic<T>& max_value, T const& value) noexcept
{
T prev_value = max_value;
while (prev_value < value &&
!max_value.compare_exchange_weak(prev_value, value))
{}
}
I tried to incorporate it into my demo and can't make it compiled. Please see the demo.
Two questions here related to the problem:
- Why the suggested version fails to compile? I can't get the reason from compiler messages (they are too long and I am not sure how to include them here, please update the question if you know the format, I will follow).
- What is the reason the updated version uses
typename std::atomic<T>::value_type arginstead of plainTor even betterT const &which makes arg referenced value const?