Повысить эквивалент ManualResetEvent?
Мне интересно, есть ли буст-эквивалент ManualResetEvent? По сути, я бы хотел кросс-платформенную реализацию... Или кто-нибудь может мне помочь имитировать функционал ManualResetEvent, используя Boost::thread? Спасибо, парни
2 ответа
Довольно просто написать событие ручного сброса, когда у вас есть мьютексы и условные переменные.
Что вам нужно, это поле, которое представляет, сигнализируется ли ваше событие сброса или нет. Доступ к полю должен быть защищен мьютексом - это включает в себя как установку / сброс вашего события, так и проверку, чтобы увидеть, сигнализировано ли оно.
Когда вы ожидаете событие, если оно в данный момент не передано, вы захотите подождать переменную условия, пока оно не будет передано. Наконец, в вашем коде, который устанавливает событие, вы захотите уведомить переменную условия, чтобы разбудить любого, кто ожидает вашего события.
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_;
};
IIRC, ManualResetEvent
Существуют, чтобы позволить нескольким потокам ожидать объекта, и один поток просыпается в момент, когда объект сигнализируется. Часть "ручной сброс" происходит из-за того, что система не сбрасывает событие автоматически после пробуждения потока; Вы делаете это вместо этого.
Это звучит очень похоже на условные переменные:
Общая схема использования такова, что один поток блокирует мьютекс, а затем вызывает
wait
на примереcondition_variable
или жеcondition_variable_any
, Когда поток просыпается от ожидания, он проверяет, является ли соответствующее условие истинным, и продолжает, если это так. Если условие не верно, тогда поток вызываетwait
снова возобновить ожидание.