我想知道如果有一个升压相当于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_variable
或condition_variable_any
。 当线程从等待唤醒,然后检查是否现在适当的条件为真,如果这样继续。 如果条件不为真,那么线程然后调用wait
再次继续等待。
文章来源: Boost equivalent of ManualResetEvent?