라이브러리를 만들어 볼까 – 이벤트 객체용 클래스

이벤트 객체는 동기화에 사용하는 객체 중 하나이다. 윈도우 환경에서는 CreateEvent, SetEvent 등을 사용해 구현하는데 사용 예제는 이 문서를 참조한다. C++에서는 흔히 이러한 윈도우 API를 클래스로 잘 포장해 사용하지만, 마침 이벤트 객체가 필요한 터라 C++ 표준 라이브러리로 구현해 봤다.

이름하여 ‘간단한 이벤트 객체’다.


#ifndef EVENT_H_
#define EVENT_H_

#include <condition_variable>
#include <mutex>

namespace surp_lib {

  /**
   * Event object.
   */
  class Event {
  public:
    Event() = default;
    ~Event() = default;

    /**
     * Signal to event.
     */
    void set();

    /**
     * Wait for signal.
     */
    void wait();

  private:
    bool flag_ = false;
    std::condition_variable condition_;
    std::mutex mutex_;
  };

}

#endif

 

#include "event.h"

using std::lock_guard;
using std::mutex;
using std::unique_lock;

namespace surp_lib {

  void Event::set() {
    lock_guard<mutex> guard(mutex_);
    flag_ = true;
    condition_.notify_one();
  }

  void Event::wait() {
    unique_lock<mutex> guard(mutex_);
    condition_.wait(guard, [this]{return flag_;});
    flag_ = false;
  }

}

 

#include <chrono>
#include <iostream>
#include <thread>

#include "event.h"

void waits(surp_lib::Event* ev) {
  std::cout << "wait event" << std::endl;
  ev->wait();
  std::cout << "end event" << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
  surp_lib::Event ev;
  std::thread t(waits, &ev);

  std::chrono::seconds duration(1);
  std::this_thread::sleep_for(duration);
  std::cout << "signal to event after 1 second" << std::endl;
  std::this_thread::sleep_for(duration);
  ev.set();

  t.join();

  return 0;
}

이름 그대로 워낙 간단해서 자동 리셋만 지원하지만 기능이 더 필요한 분은 잘 고쳐 쓰시리라 생각한다.

You may also like...