
wait() 메서드는 notify() 메서드가 호출될 때까지 현재 쓰레드를 일시정지 시킵니다.
만약 notify() 메서드를 호출하기 전에 wait() 메서드를 호출한 경우, 쓰레드는 notify() 메서드가 호출될 때까지 대기 상태에 머무릅니다.
notify() 메서드는 다른 쓰레드가 wait() 메서드를 호출한 경우, 해당 쓰레드를 일시정지 상태에서 깨워줍니다.
하지만 notify() 메서드는 notify_one() 메서드와 notify_all() 메서드로 나뉩니다.
notify_one() 메서드는 wait() 메서드를 호출한 쓰레드를 일시정지 상태에서 깨워줍니다.
notify_all() 메서드는 모든 쓰레드가 wait() 메서드를 호출한 경우, 모두 일시정지 상태에서 깨워줍니다.
위 예시에서 producer 쓰레드는 notify_all() 메서드를 호출하여 consumer 쓰레드를 일시정지 상태에서 깨워줍니다.
만약 producer 쓰레드가 notify_one() 메서드를 호출했다면, consumer 쓰레드만 일시정지 상태에서 깨워졌을 것입니다.
따라서, notify() 메서드의 호출은 wait() 메서드의 호출과 함께 사용되어야 합니다.
예시를 통해 wait() 메서드의 동작을 설명해드리겠습니다.
#hostingforum.kr
cpp
#include
#include
#include
#include
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void producer() {
std::lock_guard lock(mtx);
ready = true;
cv.notify_all(); // notify_all() 메서드를 호출하여 consumer 쓰레드를 일시정지 상태에서 깨워줍니다.
}
void consumer() {
std::unique_lock lock(mtx);
cv.wait(lock, []{return ready;}); // wait() 메서드를 호출하여 ready 변수가 true가 될 때까지 대기합니다.
}
int main() {
std::thread t1(producer);
std::thread t2(consumer);
t1.join();
t2.join();
return 0;
}
위 예시는 notify_all() 메서드를 호출하여 consumer 쓰레드를 일시정지 상태에서 깨워줍니다.
만약 notify_one() 메서드를 호출했다면, consumer 쓰레드만 일시정지 상태에서 깨워졌을 것입니다.
따라서, notify() 메서드의 호출은 wait() 메서드의 호출과 함께 사용되어야 합니다.
2025-08-09 16:37