我正在尝试理解 Boost.Asio,目的是潜在地使用条件变量和 Boost.Asio 来实现一个信号系统。
我已经看到其他 StackOverflow 问题boost asio asynchronously waiting on a condition variable,boost::asio async condition和boost condition variable issue,但是这些问题/答案都没有令人满意地触及我的一个基本问题:是真的吗那,和/或是否有根本原因,Boost.Asio 不适用于条件变量或与条件变量自然契合?
我的想法是条件变量是使用操作系统级同步对象在内部实现的(例如,Windows 上的 boost::thread::condition_variable 使用 Windows 操作系统信号量)。因为,据我目前的理解,boost::asio::io_service 旨在封装操作系统级别的同步对象,因此条件变量似乎很自然。
确实,与文件操作和套接字操作不同,在操作系统级别通常不会有与信号条件相关联的回调函数(我认为 - 我不确定这一点)。然而,在 Boost.Asio 中实现这样一个回调处理程序似乎很简单,只需要求用户提供一个回调函数,该回调函数将在条件变量发出信号时调用 - 就像用户必须为其他人提供完成处理程序例程一样boost::asio::io_service 服务。
例如(这只是一个快速的想法,而不是一个完整的原型 - 它不包含足够的参数来处理 notify_one() 与 notify_all(),不指示服务如何知道何时退出,并且可能有其他明显的遗漏或缺陷):
void condition_handler_function() {}
boost::asio::io_service service;
boost::mutex mut;
boost::condition_variable cond;
// The following class is **made up by me** - would such a class be a good idea?
boost::asio::io_service::condition_service
condserv(service, cond, mut, condition_handler_function);
condserv.async_wait_on_signal();
service.run(); // when condition variable is signaled by notify_one(),
// 'handler_function()' would be called
// ... in some other thread, later:
cond.notify_one(); // This would trigger 'handler_function()'
// in this theoretical code
也许,如果我尝试填写代码片段上面提到的缺失细节,我会很清楚这无法以干净的方式工作。然而,这种努力并非微不足道。
因此,我想在这里发布问题。Boost.Asio 不支持条件变量是否有充分的理由?
附录
我已将帖子的标题更改为引用“基于事件的接口”,因为下面 Tanner 的回答已向我澄清,它实际上是我要询问的基于事件的接口(不是真正的条件变量)。