2009-09-30 60 views
12

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

+0

你想模拟哪种事件功能? – curiousguy 2011-10-19 02:53:21

回答

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

我想你可能需要使用'boost :: condition_variable_any'才能工作。请参阅:http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable – Nick 2012-02-24 10:21:36

+0

此外,condition_variable_any :: wait方法必须被赋予互斥量作为参数,不是锁守。 – Oliver 2013-02-27 13:37:21

+0

嗯,我得到: 错误C2664'void boost :: condition_variable :: wait(boost :: unique_lock &)':无法将参数1从'boost :: lock_guard '转换为'boost :: unique_lock '和' 它使用condition_variable_any,我在condition_variable里面得到另外一个关于unlock()方法不存在的错误。 – Alexander 2016-07-06 10:33:15

1

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

这听起来非常相似,condition variables

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

+0

我基本上只有一个编写器线程,必须始终写入,永远不会被阻止,而我有一个读者线程,只有在编写器不写的时候才能读取......如果这是有道理的。谢谢 – Polaris878 2009-10-01 00:03:47

+0

我会说你的设计很有意义。 – 2009-10-01 06:28:33