gpt4 book ai didi

c++ - 唤醒 asio 截止时间计时器

转载 作者:行者123 更新时间:2023-11-28 03:32:26 37 4
gpt4 key购买 nike

我有以下线程池。

#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());

最佳答案

请注意,expires_at 仅设置 dealine_timer 到期时间,但不会“启用”计时器,因此不存在与计时器关联的异步操作。您应该调用 async_wait 并向其传递一个完成处理程序:当超时到期或计时器被取消时,将在关联的 io_service 线程之一中调用此处理程序。

调用 io_service::postdeadline_timer 无关。它只是将仿函数发送到 io_service 队列,io_service 会在其线程之一中尽快调用它。

关于c++ - 唤醒 asio 截止时间计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12119649/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com