[英]condition_variable event notifyAndWait()
我有一个循环等待事件。
我希望能够添加notifyAndWait()
函数
我不确定如何将其添加到当前课程中
class Event
{
public:
Event() : _signalled(false) {}
void notify()
{
std::unique_lock<std::mutex> lock(_mutex);
_signalled = true;
_condvar.notify_one();
}
void wait()
{
std::unique_lock<std::mutex> lock(_mutex);
_condvar.wait(lock, [&] { return _signalled; }); // also takes care about spurious wakeup
_signalled = false; // auto-reset semantics
}
private:
std::mutex _mutex;
std::condition_variable _condvar;
bool _signalled;
};
您可以使用相同的条件变量 ,使用不同的标志将信号传递回调用线程。 像这样:
class Event
{
public:
Event() : _signalled(false) {}
void notify()
{
std::cout << "notifying" << '\n' << std::flush;
{
std::unique_lock<std::mutex> lock(_mutex);
_completed = false;
_signalled = true;
}
_condvar.notify_one();
{
// now wait for completion
std::unique_lock<std::mutex> lock(_mutex);
_condvar.wait(lock, [&] { return _completed; });
}
std::cout << "completed" << '\n' << std::flush;
}
void wait()
{
{
std::unique_lock<std::mutex> lock(_mutex);
_condvar.wait(lock, [&] { return _signalled; });
_signalled = false;
}
// do stuff
auto n = hol::random_number(10);
std::cout << "doing " << n << " different things" << std::flush;
for(int i = 0; i < n; ++i)
{
std::cout << '.' << std::flush;
std::this_thread::sleep_for(std::chrono::milliseconds(hol::random_number(3000)));
}
std::cout << " done stuff" << '\n' << std::flush;
{
std::unique_lock<std::mutex> lock(_mutex);
_completed = true;
}
_condvar.notify_one();
}
private:
std::mutex _mutex;
std::condition_variable _condvar;
bool _signalled;
bool _completed;
};
int main()
{
Event e;
std::thread wait([&]{ e.wait(); });
e.notify();
wait.join();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.