라이브러리를 만들어 볼까 – 이벤트 객체용 클래스
이벤트 객체는 동기화에 사용하는 객체 중 하나이다. 윈도우 환경에서는 CreateEvent
, SetEvent
등을 사용해 구현하는데 사용 예제는 이 문서를 참조한다. C++에서는 흔히 이러한 윈도우 API를 클래스로 잘 포장해 사용하지만, 마침 이벤트 객체가 필요한 터라 C++ 표준 라이브러리로 구현해 봤다.
이름하여 ‘간단한 이벤트 객체’다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#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; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <chrono> #include <iostream> #include <thread> #include "event.h" void waits(surp_lib::Event* ev) { std::cout << "wait event" << '\n'; ev->wait(); std::cout << "end event" << '\n'; } 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" << '\n'; std::this_thread::sleep_for(duration); ev.set(); t.join(); return 0; } |
이름 그대로 워낙 간단해서 자동 리셋만 지원하지만 기능이 더 필요한 분은 잘 고쳐 쓰시리라 생각한다.