std::atomic<T>:: wait
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
atomic::wait
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
| Constants | ||||
|
(C++17)
|
||||
| Specialized member functions | ||||
|
Specialized for integral,
floating-point (C++20) and pointer types |
||||
|
Specialized for integral and
pointer types only |
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Specialized for integral types only | ||||
|
void
wait
(
T old,
std::
memory_order
order
=
std:: memory_order_seq_cst ) const noexcept ; |
(1) |
(C++20부터)
(C++26부터 constexpr) |
|
void
wait
(
T old,
std::
memory_order
order
=
|
(2) | (C++20부터) |
원자적 대기 연산을 수행합니다. 다음과 같은 단계를 반복적으로 수행하는 것처럼 동작합니다:
-
this
-
>
load
(
order
)
의
값 표현
을
old
의 값 표현과 비교합니다.
- 값이 동일한 경우, * this 가 notify_one() 또는 notify_all() 에 의해 통지받거나, 스레드가 가짜로 차단 해제될 때까지 블록합니다.
- 그렇지 않으면 즉시 반환합니다.
이러한 함수들은 기본 구현이 불필요하게 차단 해제되는 경우에도 값이 변경된 경우에만 반환됨이 보장됩니다.
만약 order 가 std:: memory_order_relaxed , std:: memory_order_consume , std:: memory_order_acquire 또는 std:: memory_order_seq_cst 가 아닌 경우, 동작은 정의되지 않습니다.
목차 |
매개변수
| old | - |
atomic
객체가 더 이상 포함하지 않는지 확인할 값
|
| order | - | 적용할 메모리 순서 제약 조건 |
참고 사항
이러한 형태의 변경 감지는 단순 폴링이나 순수 스핀락보다 종종 더 효율적입니다.
ABA 문제 로 인해, old 에서 다른 값으로 변경되었다가 다시 old 로 돌아가는 일시적인 변화가 감지되지 않을 수 있으며, 차단이 해제되지 않을 수 있습니다.
비교는 비트 단위로 이루어집니다( std::memcmp 와 유사함). 비교 연산자는 사용되지 않습니다. 객체의 값 표현에 절대 참여하지 않는 패딩 비트는 무시됩니다.
예제
#include <atomic> #include <chrono> #include <future> #include <iostream> #include <thread> using namespace std::literals; int main() { std::atomic<bool> all_tasks_completed{false}; std::atomic<unsigned> completion_count{}; std::future<void> task_futures[16]; std::atomic<unsigned> outstanding_task_count{16}; // 다양한 시간이 소요되는 여러 작업을 생성한 후 // 미완료 작업 카운트를 감소시킵니다 for (std::future<void>& task_future : task_futures) task_future = std::async([&] { // 이 sleep은 실제 작업을 수행하는 것을 나타냅니다... std::this_thread::sleep_for(50ms); ++completion_count; --outstanding_task_count; // 작업 카운트가 0이 되면 대기 중인 스레드에게 // (이 경우 메인 스레드) 알립니다 if (outstanding_task_count.load() == 0) { all_tasks_completed = true; all_tasks_completed.notify_one(); } }); all_tasks_completed.wait(false); std::cout << "Tasks completed = " << completion_count.load() << '\n'; }
출력:
Tasks completed = 16
참고 항목
|
(C++20)
|
원자적 객체를 대기 중인 스레드 중 최소 하나에 알림
(public member function) |
|
(C++20)
|
원자적 객체를 대기 중인 모든 스레드에 알림
(public member function) |
|
(C++20)
|
atomic_wait에서 차단된 스레드에 알림
(function template) |
|
(C++20)
|
atomic_wait에서 차단된 모든 스레드에 알림
(function template) |