Подтвердить что ты не робот

Повысить эквивалент ManualResetEvent?

Мне интересно, есть ли дополнительный эквивалент ManualResetEvent? В принципе, мне нужна кросс-платформенная реализация... Или может кто-то помочь мне подражать функциям ManualResetEvent, используя Boost:: thread? Спасибо, ребята

4b9b3361

Ответ 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, чтобы возобновить ожидание.