Ответ 1
Очень легко написать руководство reset, когда у вас есть мьютексы и переменные условия.
Что вам понадобится - это поле, представляющее, будет ли сигнализировано ваше событие reset или нет. Доступ к полю должен быть защищен мьютексом - это включает в себя как настройку, так и сброс вашего события, а также проверку наличия сигнала.
Когда вы ожидаете свое событие, если оно в настоящее время не сигнализировано, вам нужно будет ожидать переменную условия до тех пор, пока она не будет сигнализирована. Наконец, в вашем коде, который устанавливает событие, вы захотите уведомить переменную условия для пробуждения любого, ожидающего вашего события.
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_;
};