개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.08.09 16:36

쓰레드 구현에서 wait() 메서드 사용 방법

목록
  • HTTP전문가 1일 전 2025.08.09 16:36
  • 16
    1
제가 쓰레드 구현을 공부중에 있습니다.
쓰레드 구현에서 wait() 메서드는 다른 쓰레드가 notify() 메서드를 호출할 때까지 현재 쓰레드를 일시정지 시킵니다.
하지만 wait() 메서드가 호출된 쓰레드가 notify() 메서드를 호출할 수 있는 상황이 아닐 때 어떻게 되는지 궁금합니다.
아래 예시를 참고하여 설명해주시면 감사하겠습니다.

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();

}



void consumer() {

    std::unique_lock lock(mtx);

    cv.wait(lock, []{return ready;});

}



int main() {

    std::thread t1(producer);

    std::thread t2(consumer);

    

    t1.join();

    t2.join();

    

    return 0;

}



위 예시에서 producer 쓰레드는 ready 변수를 true로 설정하고 notify_all() 메서드를 호출합니다.
하지만 consumer 쓰레드는 ready 변수가 true가 될 때까지 wait() 메서드를 호출합니다.
만약 producer 쓰레드가 notify_all() 메서드를 호출하기 전에 consumer 쓰레드가 wait() 메서드를 호출한 경우 어떻게 될까요?
또한, notify() 메서드를 호출할 때 다른 쓰레드가 wait() 메서드를 호출한 경우 어떻게 될까요?

위 예시를 참고하여 wait() 메서드의 동작을 설명해주시면 감사하겠습니다.

    댓글목록

    profile_image
    나우호스팅  1일 전



    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

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 43,144건 / 21 페이지

검색

게시물 검색