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