升压的ManualResetEvent的相同呢?(Boost equivalent of Manua

2019-08-17 02:57发布

我想知道如果有一个升压相当于ManualResetEvent的吗? 基本上,我想一个跨平台实现...或者,可能有人帮助我使用boost ::线程模仿的ManualResetEvent的功能? 多谢你们

Answer 1:

这是很容易当你有互斥体和条件变量写一个手动重置事件。

你需要的是一个代表你的复位事件是否标志着与否的字段。 访问现场将需要由一个互斥看守 - 这包括设置/重置事件以及检查,看它是否发出信号。

当你在你的事件等待,如果当前没有信号,你将要在一个条件变量等待,直到它发出信号。 最后,在你的代码,设置事件,你会想通知的条件变量唤醒任何人等待您的活动。

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_;
};


Answer 2:

IIRC, ManualResetEvent小号存在允许多个线程等待一个对象,当对象处于信号一个线程获得在一个时间醒来。 “手动复位”的一部分来自于一个事实,它唤醒一个线程后,系统不会自动复位事件; 你这样做来代替。

这听起来非常类似条件变量 :

一般使用模式是一个线程锁定一个互斥体,然后调用wait上的一个实例condition_variablecondition_variable_any 。 当线程从等待唤醒,然后检查是否现在适当的条件为真,如果这样继续。 如果条件不为真,那么线程然后调用wait再次继续等待。



文章来源: Boost equivalent of ManualResetEvent?