唤醒asio截止时间计时器
Wake up asio deadline timer
我有以下线程池。
#include <queue>
#include <map>
#include <boost/shared_ptr.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/thread/thread.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp> // remove me (only for io)
class ThreadPool
{
void run() {
// get some work from a task queue and then work on it
}
public:
void work_as_mainthread(void) { m_io_service.run(); }
ThreadPool(int poolSize = 4) : timer(m_io_service)
{
timer.expires_from_now(boost::posix_time::seconds(1));
m_pWork.reset( new boost::asio::io_service::work(m_io_service) );
for ( int i = 0; i < poolSize; ++i)
m_threadGroup.create_thread( boost::bind(&boost::asio::io_service::run, &m_io_service) );
}
private:
boost::asio::io_service m_io_service;
boost::asio::deadline_timer timer;
boost::shared_ptr<boost::asio::io_service::work> m_pWork;
boost::thread_group m_threadGroup;
};
int main()
{
int n_threads = 2;
ThreadPool pool(n_threads);
// add some tasks here...
pool.work_as_mainthread();
return 0;
}
这是一个最小的例子,这里是完整的代码。编译如下:
g++ -Wall -g -lboost_thread -lboost_date_time -lboost_system main.cpp -o main
注意,我没有调用async_wait()(我不知道为什么需要它,线程池到目前为止还可以工作)。
现在,可能会突然发生这样的情况:一个任务希望在另一个任务超时之前完成另一项任务。告诉m_io_service立即执行处理程序(即使计时器还不感兴趣),然后像什么都没发生一样继续的最好方法是什么?我真的无法从稀疏的文档中弄清楚。
这不起作用:
timer.expires_at(boost::posix_time::microsec_clock::universal_time());
注意,expires_at
只设置dealine_timer
的过期时间,而不"启用"计时器,因此没有与计时器关联的异步操作。您应该调用async_wait
,并向其传递一个完成处理程序:当超时到期或计时器取消时,将在关联的io_service
的一个线程中调用此处理程序。
调用io_service::post
与deadline_timer
无关。它只是将您的函子发布到io_service
队列,io_service
会在其一个线程中尽快调用它。
相关文章:
- Linux的Cpp上的计时器
- 提升 ASIO 无法识别计时器对象
- 使计时器在C++进程中的特定时间关闭,以便同步两个进程
- C :从一定的时间戳启动计时器,然后将其增加
- 如果STD :: COUT发表评论,则计时器需要更长的时间才能达到10.f秒
- 在一段时间内进行计时器
- 如何在多个线程中安全地使用提升截止时间计时器
- 在运行时间内用户输入任何内容时,如何停止计时器
- 唤醒asio截止时间计时器
- 如何在C++中使用计时器在给定时间内强制输入
- 最适合正确测量缓存访问时间的计时器
- 制作一个计时器,在以毫秒为单位的一定时间后执行某个函数
- C++计时器(等待一段时间)
- 如何在没有计时器的情况下确定经过了多少时间
- 通过引用传递与通过指针传递:Boost线程和截止时间计时器
- 如何在c++中使用boost实现与系统时间无关的计时器回调
- 如何获得比Windows XP上的计时器滴答(15毫秒)更高精度的时间
- 你如何嘲笑助推计时器的时间
- 用户计时器在第一次使用后出错,无论我等待多长时间都会返回零
- 使用Boost基本截止时间计时器来调用类方法