首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ManualResetEvent的Boost等价物?

ManualResetEvent的Boost等价物?
EN

Stack Overflow用户
提问于 2009-09-30 23:03:38
回答 2查看 3.5K关注 0票数 12

我想知道是否有ManualResetEvent的boost等价物?基本上,我想要一个跨平台的实现。或者,有人能帮我用Boost::thread模仿ManualResetEvent的功能吗?谢谢你们

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-01 00:09:24

当你有互斥锁和条件变量时,很容易编写一个手动重置事件。

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

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

代码语言:javascript
复制
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_;
};
票数 13
EN

Stack Overflow用户

发布于 2009-09-30 23:42:55

IIRC,ManualResetEvent的存在允许多个线程等待一个对象,并且当对象被用信号通知时,一个线程被唤醒。“手动重置”部分来自于这样一个事实,即系统在唤醒线程后不会自动重置事件;相反,您可以这样做。

这听起来非常类似于condition variables

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1501111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档