atomic_atomic_compare_exchange
atomic_atomic_compare_exchange (비교 후 교환)
std::atomic_compare_exchange_weak와 std::atomic_compare_exchange_strong은 원자적으로 객체의 현재 값을 기대값과 비교해 같으면 원하는 값으로 바꾸고, 다르면 기대값을 현재 값으로 갱신해요. CAS(Compare-And-Swap) 연산이에요.
출처: cppreference
본문
std::atomic_compare_exchange_weak와 std::atomic_compare_exchange_strong은 <atomic> 헤더에 정의된 자유 함수(free function)예요.
template< class T >
bool atomic_compare_exchange_weak
( std::atomic<T>* obj, typename std::atomic<T>::value_type* expected,
typename std::atomic<T>::value_type desired ) noexcept;
template< class T >
bool atomic_compare_exchange_strong
( std::atomic<T>* obj, typename std::atomic<T>::value_type* expected,
typename std::atomic<T>::value_type desired ) noexcept;
atomic_compare_exchange_strong—obj가 가리키는 객체의 현재 값이expected가 가리키는 값과 같으면desired로 바꾸고true를 반환해요. 다르면expected가 가리키는 값을 현재 값으로 갱신하고false를 반환해요 (read-modify-write 연산).atomic_compare_exchange_weak—atomic_compare_exchange_strong과 비슷하지만 가끔 실패(spurious failure)할 수 있어요. 루프 안에서 재시도할 때 주로 써요.
비교는 객체와 expected의 값 표현(value representation)이 비트 단위로 같은지 검사해요. std::atomic<T>::value_type은 trivially copyable이어야 해요.
예제 (Example)
#include <atomic>
std::atomic<bool> flag{true};
int main()
{
bool expected = true;
bool old = flag;
// flag가 expected와 같으면 false로 바꾼다
bool swapped = atomic_compare_exchange_strong(&flag, &expected, false);
}