std:: atomic_exchange, std:: atomic_exchange_explicit
|
헤더에 정의됨
<atomic>
|
||
|
template
<
class
T
>
T atomic_exchange
(
std::
atomic
<
T
>
*
obj,
|
(1) | (C++11부터) |
|
template
<
class
T
>
T atomic_exchange
(
volatile
std::
atomic
<
T
>
*
obj,
|
(2) | (C++11부터) |
|
template
<
class
T
>
T atomic_exchange_explicit
(
std::
atomic
<
T
>
*
obj,
|
(3) | (C++11부터) |
|
template
<
class
T
>
T atomic_exchange_explicit
(
volatile
std::
atomic
<
T
>
*
obj,
|
(4) | (C++11부터) |
목차 |
매개변수
| obj | - | 수정할 atomic 객체에 대한 포인터 |
| desired | - | atomic 객체에 저장할 값 |
| order | - | 메모리 동기화 순서 |
반환값
obj 가 가리키는 원자 객체가 이전에 보유하고 있던 값.
예제
스핀락 뮤텍스는 원자적 교환 연산을 사용하여 사용자 공간에서 구현할 수 있으며, 이는 std:: atomic_flag_test_and_set 과 유사합니다:
#include <atomic> #include <iostream> #include <thread> #include <vector> std::atomic<bool> lock(false); // holds true when locked // holds false when unlocked int new_line{1}; // the access is synchronized via atomic lock variable void f(int n) { for (int cnt = 0; cnt < 100; ++cnt) { while (std::atomic_exchange_explicit(&lock, true, std::memory_order_acquire)) ; // spin until acquired std::cout << n << (new_line++ % 80 ? "" : "\n"); std::atomic_store_explicit(&lock, false, std::memory_order_release); } } int main() { std::vector<std::thread> v; for (int n = 0; n < 8; ++n) v.emplace_back(f, n); for (auto& t : v) t.join(); }
가능한 출력:
02222222222222222222222002222222222222222222222222222222222222222222222222222222 22222222200022222222202222211111111111110000011111111100000000000000110001111111 00011111000001111110000011111100000111000000001111111111111110000010000001001111 11011111111011111011000000000000111100000000000001111000011133333333333333333333 33333333333333333333333333333333333333333333333333333333333333333333333333333333 44444444444444444444444444444444444444444444444444444444444444444444444444444444 44444444444444444444555555555555555555555555555555555555555555555555555555555555 55555555555555555555555555555555555555556666666666666666666666666666666666666666 66666666666666666666666666666666666666666666666666666666666677777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| P0558R1 | C++11 |
정확한 타입 일치가 요구됨
T
가 여러 인수에서 추론되었기 때문
|
T
는 오직
obj 에서만 추론됨 |
참고 항목
|
원자 객체의 값을 원자적으로 교체하고 이전에 보유하던 값을 획득합니다
(
std::atomic<T>
의
public member function)
|
|
|
원자 객체의 값을 비원자 인자와 원자적으로 비교하여 같으면 원자 교체를, 다르면 원자 로드를 수행합니다
(function template) |
|
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
|
std::shared_ptr
에 대한 원자 연산을 특수화합니다
(함수 템플릿) |
|
C 문서
를 참조하십시오:
atomic_exchange
,
atomic_exchange_explicit
|
|