提升相当于ManualResetEvent?

时间:2009-09-30 23:03:38

标签: c++ multithreading boost thread-safety

我想知道是否有相当于ManualResetEvent的提升?基本上,我想要一个跨平台的实现...或者,有人可以使用Boost :: thread帮我模仿ManualResetEvent的功能吗?谢谢你们

2 个答案:

答案 0 :(得分:12)

当您拥有互斥锁和条件变量时,编写手动重置事件非常容易。

您需要的是一个字段,表示您的重置事件是否已发出信号。访问该字段需要由互斥锁保护 - 这包括设置/重置您的事件以及检查是否已发出信号。

当您等待事件时,如果当前未发出信号,您将需要等待条件变量,直到它发出信号。最后,在设置事件的代码中,您需要通知条件变量以唤醒等待您的事件的任何人。

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

答案 1 :(得分:1)

IIRC,ManualResetEvent存在允许多个线程在对象上等待,并且一个线程在对象发出信号时被唤醒。 “手动复位”部分来自于系统在唤醒线程后不会自动重置事件的事实;你这样做了。

这听起来与condition variables非常相似:

  

一般用法模式是一个线程锁定互斥锁,然后在waitcondition_variable的实例上调用condition_variable_any。当线程从等待中唤醒时,它会检查现在是否存在适当的条件,如果是,则继续。如果条件不为真,则线程再次调用wait以继续等待。