2009-09-30 3 views
12

ManualResetEvent에 해당하는 부스트가 있다면 궁금합니다. 기본적으로, 나는 크로스 플랫폼 구현을 원합니다 ... 아니면 Boost :: thread를 사용하여 ManualResetEvent의 기능을 모방 할 수있게 도와 줄 수 있습니까? 고마워요ManualResetEvent의 부스트?

+0

어떤 이벤트 함수를 에뮬레이트 하시겠습니까? – curiousguy

답변

12

뮤텍스와 조건 변수가있을 때 수동 재설정 이벤트를 작성하는 것은 꽤 쉽습니다.

리셋 이벤트의 신호 여부를 나타내는 필드가 필요합니다. 필드에 대한 액세스는 뮤텍스에 의해 보호되어야합니다. 여기에는 이벤트 설정/재설정과 신호 여부를 확인하는 것이 포함됩니다.

이벤트를 기다리는 중, 현재 신호가 보내지지 않으면 신호가있을 때까지 조건 변수를 기다리고 싶을 것입니다. 마지막으로, 이벤트를 설정하는 코드에서 조건 변수를 통보하여 이벤트를 기다리는 모든 사람을 깨우는 것이 좋습니다.

class manual_reset_event 
{ 
public: 
    manual_reset_event(bool signaled = false) 
     : signaled_(signaled) 
    { 
    } 

    void set() 
    { 
     { 
      boost::lock_guard<boost::mutex> lock(m_); 
      signaled_ = true; 
     } 

     // Notify all because until the event is manually 
     // reset, all waiters should be able to see event signalling 
     cv_.notify_all(); 
    } 

    void unset() 
    { 
     boost::lock_guard<boost::mutex> lock(m_); 
     signaled_ = false; 
    } 


    void wait() 
    { 
     boost::lock_guard<boost::mutex> lock(m_); 
     while (!signaled_) 
     { 
      cv_.wait(lock); 
     } 
    } 

private: 
    boost::mutex m_; 
    boost::condition_variable cv_; 
    bool signaled_; 
}; 
+1

이 기능을 사용하려면'boost :: condition_variable_any'를 사용해야 할 수도 있습니다. 참조 : http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable – Nick

+0

또한 condition_variable_any :: wait 메서드는 뮤텍스를 매개 변수로 지정해야하며, 자물쇠 가드가 아니야. – Oliver

+0

흠, 내가 얻을 : 오류 C2664 '무효 향상을 :: condition_variable :: 대기가 (부스트 : unique_lock &)를': '부스트 : 를 lock_guard'에 '부스트 : unique_lock &' 매개 변수 1 변환 할 수 없습니다 그것은 condition_variable_any를 사용하여, unlock_failed 메소드에 대한 condition_variable 내에 또 다른 에러가 발생합니다. – Alexander

1

개체에 대해 여러 스레드가 대기 할 수 있도록하려면 ManualResetEvent이 존재하고 개체가 신호를 받으면 한 번에 하나의 스레드가 깨어날 수 있습니다. "수동 재설정"부분은 스레드가 깨어 난 후에 시스템이 이벤트를 자동으로 재설정하지 않는다는 사실에서 비롯됩니다. 당신은 대신 그렇게합니다.

condition variables 매우 유사 소리 :

일반적인 사용 패턴은 하나 개의 스레드가 condition_variable 또는 condition_variable_any의 인스턴스에 wait를 호출 한 다음 뮤텍스를 잠그고 있다는 것입니다. 쓰레드가 대기 상태에서 깨어 났을 때, 적절한 조건이 참인지를 검사하고 만약 그렇다면 계속 진행한다. 조건이 참이 아니면 스레드는 wait을 다시 호출하여 대기를 재개합니다.

+0

필자는 필자가 쓰지 않을 때만 읽을 수있는 독자 스레드가있는 반면 기본적으로 항상 쓰고 차단되지 않아야하는 작성자 스레드를 가지고있다. 감사합니다 – Polaris878

+0

나는 당신의 디자인이 이치에 맞다고 말할 것입니다. –