循环调用 boost io_service poll
Posted
技术标签:
【中文标题】循环调用 boost io_service poll【英文标题】:call boost io_service poll in a loop 【发布时间】:2014-06-12 17:43:40 【问题描述】:我目前正在尝试使用 boost::asio 从这样的循环中手动更新我的程序的一部分:
class A
A::A() : m_io()
A::update()
m_io.poll();
//do other stuff
A::postSomething()
while(1)
m_io.post(...);
sleep(1000);
void main()
A a;
boost::thread thr(boost::bind(&A::postSomething, &a));
while(1)
a.update();
如果我运行程序,则不会处理 post()。但是,如果我像这样在类成员 update() 中添加 m_io.reset():
A::update()
m_io.poll();
//do other stuff
m_io.reset();
这似乎可行,但我仍然想知道这样做是否正确???我是否会因为 reset() 而失去 post() 调用的风险?
谢谢。
【问题讨论】:
当你说“没有 post() 被处理”时,你的意思是你打电话给post
,然后你打电话给poll
,并没有完成任何一项已发布的工作打电话给poll
?
是的,就是这样,调用poll之后不会调用post回调。
你能生成一个完整的、可编译的、最小的测试用例来证明问题吗?
你应该构造一个 work 对象来保持 io_service 活着。
你希望sleep(1000)
做什么?
【参考方案1】:
以下是如何使用工作对象的演示:Live On Coliru
#include <iostream>
#include <boost/asio.hpp>
#include <boost/optional.hpp>
#include <boost/thread.hpp>
class A
using ios = boost::asio::io_service;
ios m_io;
boost::optional<ios::work> m_active;
public:
A() : m_io(), m_active(ios::work(m_io))
~A()
m_active.reset();
m_io.run(); // to completion
void update()
m_io.poll();
//do other stuff
void postSomething()
int i = 0;
while(m_active)
m_io.post([&]std::cout<<"something" << ++i << "\n";);
boost::this_thread::sleep_for(boost::chrono::milliseconds(250));
;
int main()
boost::thread thr;
A a;
thr = boost::thread(boost::bind(&A::postSomething, &a));
for (int i = 0; i < 300; ++i)
boost::this_thread::sleep_for(boost::chrono::milliseconds(5));
a.update();
thr.join(); // thread will not join unless A is destructed (m_active is cleared)
但是,您可能还想查看 Developing Boost Asio Extensions,因为这将允许您“仅 run()
”并仍然交错您自己的(可能是非 IO)任务
【讨论】:
确实,通过这个例子,我明白我需要一个工人。没有工人,它就行不通。感谢 sehe 和 David Schwartz。 哇。多诗人。如此明智 :) (我猜你的意思是work
带有 'worker' 的对象 - 后者通常用于指示后台线程)以上是关于循环调用 boost io_service poll的主要内容,如果未能解决你的问题,请参考以下文章
Boost::Asio : io_service.run() vs poll() 或者我如何在主循环中集成 boost::asio
从线程池调用时,boost 的 io_service 是不是共享请求线程?
在 boost::asio::io_service 上调用 run 时崩溃
从多个线程调用 boost::asio::io_service 运行函数