- 主题:boost asio用stream_descriptor访问fifo时,读写不会完成
1. 你的代码里没有看见io_context.run()在哪儿,你说把io_context.run放到WaitEvent之前,是指你手动改的代码?那你原来代码里io_context.run()是在哪儿运行的?
2. 如果你至始至终只有一个线程运行io_context.run(),那显然你不能阻塞这个线程。因为io_context本身不是thread_pool,是不带worker的,哪个线程运行run,哪个线程是worker,io_context本身只是一个事件队列而已。
【 在 z16166 的大作中提到: 】
: 我需要尽可能复用io_context,毕竟每次分配新的io_context对象有开销
: 之前我试过,只要执行了io_context.stop()后,如果再执行io_context.restart()和io_context.run(),会不正常,卡住,此时就不能复用io_context对象。
: 所以在一定范围内改为只要执行了stop(),就释放掉io_context,重新分配一个新的io_context。
: ...................
--
FROM 125.119.102.*
我看你的代码的意图本质上是想写一个阻塞函数,但是中间io操作希望通过asio来调用OS层面的异步模型来进行,所以本身wait这个动作就需要一个阻塞等待,没有必要用deadline timer这个async_wait
--
FROM 125.119.102.*
如果你的意图是想把io_context变成一个thread_pool来用,那你需要一个work guard,你可以看一下asio里关于work guard的参考,具体来说一个work guard保证io_context里事件队列清空以后,线程不会退出run
不知道你asio用的是哪个版本,我记得在1.73之后的版本里,加了asio::thread_pool这个executor,你可以用这个来代替io_context
【 在 z16166 的大作中提到: 】
: 我需要尽可能复用io_context,毕竟每次分配新的io_context对象有开销
: 之前我试过,只要执行了io_context.stop()后,如果再执行io_context.restart()和io_context.run(),会不正常,卡住,此时就不能复用io_context对象。
: 所以在一定范围内改为只要执行了stop(),就释放掉io_context,重新分配一个新的io_context。
: ...................
--
FROM 125.119.102.*
感觉你贴出来的代码坑不少。ipc我直接用shared memory多,named pipe我不太有经验。这个函数会不会被并行调用?kernel层面对named pipe会有加锁/排队之类的操作吗?如果没有,那在user层面多少需要有个排队加锁的结构,那用asio的确没问题。
不过,就你这个情况来说,你现在需要一个work guard,但是相应的,你在关闭的时候需要有一个机制来reset这个work guard,不然你程序不能正常退出
【 在 z16166 的大作中提到: 】
: 改之前是这样的,单开一个线程执行run。
: m_thread = new std::thread([&]() { m_io->run(); });
: 本来这种单线程带超时的,用select()搞一下就行。用asio是杀鸡用牛刀了。
: ...................
--
FROM 115.205.236.*