Boost.Asio 提供了一些运行时配置选项,可用于精细调整 Boost.Asio 的行为,例如启用或禁用特定的优化。可用配置选项如下表所示。
|
章节 |
键 |
类型 |
Default |
描述 |
|---|---|---|---|---|
|
|
|
|
|
这是对 当使用 Windows I/O 完成端口后端时,此值将传递给 当使用基于事件循环的后端时,该实现将值 无论为此配置选项指定什么值, |
|
|
|
|
|
使用基于事件循环的后端时,此选项用于启用或禁用调度程序中的锁定。当设置为 — 必须小心确保对 — 异步解析操作将以 — 如果 |
|
|
|
|
|
当使用基于事件循环的后端时,尝试在不阻塞的情况下获取调度程序内部锁的次数。 |
|
|
|
|
|
调度程序等待其事件循环任务完成的最长时间(以微秒为单位)。值为 |
|
|
|
|
|
调度程序在空闲线程(即未执行处理程序或等待事件循环的线程)上等待唤醒事件的最长时间(以微秒为单位)。值为 |
|
|
|
|
|
在构造时分配的内部事件循环 I/O 对象状态的数量。 事件循环实现使用每个 I/O 对象的状态来跟踪未完成操作的队列等内容。这些状态对象在 I/O 对象销毁后会被回收,但如果没有可用的未使用的状态对象,则会分配新的状态对象。 如果构造时已知 I/O 对象的上限,则可以通过设置此配置选项来确保构造完成后不会发生分配。 |
|
|
|
|
|
在事件循环周围启用或禁用 I/O 对象注册和注销的锁定。 如果设置为 |
|
|
|
|
|
在执行 I/O 对象注册或注销时,尝试在不阻塞的情况下获取事件循环锁的次数。 |
|
|
|
|
|
在事件循环中启用或禁用每个 I/O 对象的锁定。 如果设置为 |
|
|
|
|
|
在不阻塞的情况下尝试获取事件循环的每个 I/O 对象锁的次数。 |
|
|
|
|
|
仅限 Linux 当设置为 |
|
|
|
|
|
仅限 Linux 当设置为 |
|
|
|
|
|
仅限 Linux 当设置为 |
|
|
|
|
|
在内部计时器队列堆中预留的条目数。 如果构造时已知计时器的上限,则可以通过设置此配置选项来确保构造完成后不会发生计时器分配。 |
|
|
|
|
|
用于异步名称解析的内部线程数。 如果非零,则在构造第一个解析器对象时创建指定数量的线程。否则,在第一次 |
这些配置选项与执行上下文(如 io_context 或 thread_pool)相关联。要使用非默认值,必须在构造时将配置服务安装到执行上下文中。下面的章节展示了实现此目的的几种方法。
要从字符串读取配置选项,请使用 config_from_string 对象构造执行上下文。
boost::asio::io_context my_io_context{ boost::asio::config_from_string{ "scheduler.concurrency_hint=10\n" "scheduler.locking=1"}};
每个变量必须独占一行,格式为:
section.key=value
或者,如果指定了可选前缀:
prefix.section.key=value
空行和以 # 开头的行将被忽略。也允许在值后面包含以 # 开头的注释。
要从环境变量读取配置选项,请使用 config_from_env 对象构造执行上下文。
boost::asio::io_context my_io_context{ boost::asio::config_from_env{"my_app"}};
环境变量名称是通过连接前缀、节和键,以 `_` 作为分隔符,然后将结果字符串转换为大写来形成的。例如,给定前缀 "my_app" 和 "scheduler" / "concurrency_hint" 选项,则值将从名为 MY_APP_SCHEDULER_CONCURRENCY_HINT` 的环境变量中读取。
为了向后兼容,io_context 构造函数可以接受一个整数作为并发提示。这用于初始化配置选项,如以下表格所述。
|
concurrency_hint 值 |
效果 |
|---|---|
|
|
等同于设置 — — — — |
|
|
— — — — |
|
|
— — — — |
|
|
— — — — |
默认构造的 io_context 对象所使用的并发提示可以通过在编译时定义 BOOST_ASIO_CONCURRENCY_HINT_DEFAULT 宏来覆盖。例如,在编译器命令行中指定
-DBOOST_ASIO_CONCURRENCY_HINT_DEFAULT=1
意味着在该程序的所有默认构造的 io_context 对象中都使用并发提示 1。同样,使用 1 构造的 io_context 对象所使用的并发提示可以通过定义 BOOST_ASIO_CONCURRENCY_HINT_1 来覆盖。例如,将
-DBOOST_ASIO_CONCURRENCY_HINT_1=BOOST_ASIO_CONCURRENCY_HINT_UNSAFE
传递给编译器将禁用所有这些对象的线程安全。
应用程序和第三方库可以利用 config 类将自己的配置选项与执行上下文关联起来,或访问上面列出的配置选项。通过向 get 成员函数传递节、键和默认值来访问配置参数的值。
boost::asio::config cfg{ctx}; bool enable_locking = cfg.get("scheduler", "locking", true);