Asio中io_context不同并发提示参数的多线程访问合法性问询
你的理解基本完全正确,补充剩余的规则和你表格中不确定的项如下:
各并发提示参数的线程安全规则
ASIO_CONCURRENCY_HINT_UNSAFE:所有和io_context关联的操作(包括io_context本身的所有方法、所有关联IO对象的方法)都只能在同一个线程调用,任何跨线程操作都是未定义行为,符合你的理解。ASIO_CONCURRENCY_HINT_UNSAFE_IO:仅保证io_context本身的调度相关方法(post、dispatch、stop等)线程安全,所有关联IO对象的方法都只能在运行io_context::run系列函数的线程调用,跨线程调用IO对象方法属于非法操作,符合你的理解。ASIO_CONCURRENCY_HINT_1(即传参1):仅允许单个线程调用io_context::run/run_one/poll/poll_one系列运行方法,io_context本身的其他公共方法(post、stop等)线程安全,但所有关联IO对象的方法不支持跨线程调用,跨线程调用IO对象方法仍属于未定义行为。ASIO_CONCURRENCY_HINT_SAFE(默认值):全场景线程安全,允许多线程同时调用run,也允许跨线程调用任何io_context方法和IO对象方法。
补全后的行为对照表
| 场景 | 1 | UNSAFE | UNSAFE_IO | SAFE |
|---|---|---|---|---|
| 同一线程内调用IO方法(1) | ✔ | ✔ | ✔ | ✔ |
其他线程调用post()(2) | ✔ | ✖ | ✔ | ✔ |
| 其他线程调用IO对象的IO方法(3) | ✖ | ✖ | ✖ | ✔ |
双线程同时调用run()(4) | ✖ | ✖ | ✖ | ✔ |
其他线程调用io_context::stop()(5) | ✔ | ✖ | ✖ | ✔ |
示例代码的问题
你给出的示例代码中使用ASIO_CONCURRENCY_HINT_1的情况下,以下操作属于未定义行为:
- 操作3:跨线程调用
acc.async_accept,属于跨线程调用IO对象方法 - 操作4:双线程同时调用
io_context的运行方法
内容的提问来源于stack exchange,提问作者tstenner
相关产品推荐
相关产品推荐

