【发布时间】:2012-08-25 06:06:40
【问题描述】:
我有以下线程池。
#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;
}
这是一个最小的例子,完整的代码here。像这样编译:
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());
【问题讨论】:
-
如果不调用async_wait,那你说的是什么handler?
-
我刚刚在这里发布了更多代码。我希望它有所帮助。
-
不幸的是,它没有帮助。请在您的代码中解释计时器的用途。预计会做什么?如果你从不打电话给
async_wait(或同步。wait),它什么也不做。你在说什么处理程序? -
我想我明白了你的问题。缺少代码。我使用了
post方法。让我编辑我的帖子,等一下! -
啊,现在可以了。在拨打
deadline_timer::expires_at()之后,确实,我忘了拨打deadline_timer:async_wait()。相反,我调用了io_service::oist(),它立即执行了任务。谢谢伊戈尔,你的提示很好,我真的忘了async_wait()。
标签: c++ boost boost-asio threadpool