19#if _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
24# include <semaphore.h>
33 int ret = sem_init(&sem, 0, 0);
34 if(ret != 0)
throw std::system_error(std::error_code(errno, std::generic_category()));
39 ~semaphore() { sem_destroy(&sem); }
46 int ret = sem_post(&sem);
47 if(ret != 0)
throw std::system_error(std::error_code(errno, std::generic_category()));
50 ret = sem_getvalue(&sem, &value);
51 if(ret != 0 || value > 1)
throw std::system_error(std::error_code(errno, std::generic_category()));
58 int ret = sem_getvalue(&sem, &value);
59 if(ret != 0)
throw std::system_error(std::error_code(errno, std::generic_category()));
69 int ret = sem_wait(&sem);
70 if(ret != 0)
throw std::system_error(std::error_code(errno, std::generic_category()));
76 int ret = sem_trywait(&sem);
78 if(errno != EAGAIN)
throw std::system_error(std::error_code(errno, std::generic_category()));
97# include <condition_variable>
108 std::unique_lock<
decltype(_mutex)>
lock(_mutex);
111 if(_count == 0) _condition.notify_one();
115 std::unique_lock<
decltype(_mutex)>
lock(_mutex);
120 std::unique_lock<
decltype(_mutex)>
lock(_mutex);
121 while(_count > 0) _condition.wait(
lock);
126 std::unique_lock<
decltype(_mutex)>
lock(_mutex);
139 std::condition_variable _condition;
bool is_ready_and_reset()