You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

deadline_timer::wait是否让渡任务?io_service线程阻塞及代码问询

关于Boost.Asio中deadline_timer::wait的任务调度疑问

咱们一个个拆解你的问题:

1. deadline_timer::wait是否会让渡给其他任务?

不会——deadline_timer::wait()是同步阻塞式调用,它会牢牢占住当前执行的线程,直到定时器到期或者被主动取消,期间不会主动让渡CPU给io_service里的其他任务。

2. 在io_service内部调用deadline_timer::wait时,等待期间io_service内的其他任务是否会被执行?

这得看你运行io_service::run()的线程数量:

  • 如果只有一个线程处理io_service:这个线程会被wait()完全阻塞,io_service队列里的其他任务根本没机会被执行。
  • 如果有多个线程处理io_service:阻塞的只是执行wait()的那一个线程,其他线程可以继续处理队列里的任务。

3. 你的代码示例中"HELLO!"是否会被打印?

答案是不会。
咱们梳理下代码的执行流程:

  1. 你创建了io_service和对应的work对象(用来防止run()在无任务时退出)。
  2. 启动一个线程运行service.run(),这个线程开始处理io_service的任务队列。
  3. 你提交了两个任务:第一个是创建等待100000秒的定时器并调用wait(),第二个是打印"HELLO!"。
  4. 因为只有一个线程处理任务队列,它会先执行第一个任务——调用timer.wait()后,这个线程直接被长期阻塞,再也没机会取出并执行第二个打印任务。

如果想让打印任务正常执行,你可以改成使用异步等待(timer.async_wait()),这样第一个任务会立即返回,线程就能继续处理第二个任务;或者启动多个线程来运行service.run(),让其他线程负责处理打印任务。

内容的提问来源于stack exchange,提问作者ronag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:26:04