Pol*_*878 12 c++ multithreading boost thread-safety
我想知道是否有相当于ManualResetEvent的提升?基本上,我想要一个跨平台的实现...或者,有人可以使用Boost :: thread帮我模仿ManualResetEvent的功能吗?多谢你们
R S*_*hko 13
当您拥有互斥锁和条件变量时,编写手动重置事件非常容易.
您需要的是一个字段,表示您的重置事件是否已发出信号.访问该字段需要由互斥锁保护 - 这包括设置/重置您的事件以及检查是否已发出信号.
当您等待事件时,如果当前未发出信号,您将需要等待条件变量,直到它发出信号.最后,在设置事件的代码中,您需要通知条件变量以唤醒等待您的事件的任何人.
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_;
};
Run Code Online (Sandbox Code Playgroud)