我正在尝试理解Boost.Asio,以便使用条件变量与Boost.Asio结合实现信号系统。
我已经看到了其他StackOverflow问题:boost asio异步等待条件变量、boost::asio异步条件和boost条件变量问题,但这些问题/答案都没有令我满意地回答一个重要问题:是否真的如此,并且/或者是否有根本性原因,导致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 在下面的回答中澄清了我正在询问的确实是基于事件的接口(并非真正的条件变量)。
boost::asio::deadline_timer
来获得所需的行为略微晦涩。 - Tanner Sansbury