Boost.Asio 提供了一些运行时配置选项,可用于微调 Boost.Asio 的行为,例如启用或禁用特定的优化。可用的配置选项列在下表中。
章节 |
键 |
类型 |
Default |
描述 |
---|---|---|---|---|
|
|
|
|
这是向 当使用 Windows I/O 完成端口后端时,此值会传递给 当使用基于 reactor 的后端时,实现会识别值 无论为此配置选项指定什么值, |
|
|
|
|
当使用基于 reactor 的后端时,这用于启用或禁用调度器中的锁定。当设置为 — 必须小心确保对 — 异步解析操作将以 — 如果 |
|
|
|
|
当使用基于 reactor 的后端时,第一次尝试获取调度器内部锁而不阻塞的次数。 |
|
|
|
|
调度器等待其 reactor 任务完成的最长时间(以微秒为单位)。值为 |
|
|
|
|
调度器在空闲线程(即未执行处理程序或等待 reactor 的线程)中等待唤醒事件的最长时间(以微秒为单位)。值为 |
|
|
|
|
构造时分配的内部 reactor I/O 对象状态的数量。 reactor 实现使用每个 I/O 对象的状态来跟踪未完成操作的队列等内容。这些状态对象在 I/O 对象销毁后会被回收,但如果没有可用的未使用状态对象,则会分配新的状态对象。 如果在构造时已知 I/O 对象的上限,则可以设置此配置选项以确保构造完成后不会发生分配。 |
|
|
|
|
在 I/O 对象注册和注销期间,启用或禁用 reactor 中的锁定。 如果设置为 |
|
|
|
|
在执行 I/O 对象注册或注销时,第一次尝试获取 reactor 锁而不阻塞的次数。 |
|
|
|
|
在 reactor 中启用或禁用每个 I/O 对象的锁定。 如果设置为 |
|
|
|
|
第一次尝试获取 reactor 的每个 I/O 对象锁而不阻塞的次数。 |
|
|
|
|
在内部计时器队列堆中保留的条目数。 如果在构造时已知计时器的上限,则可以设置此配置选项以确保构造完成后不会发生计时器分配。 |
|
|
|
|
用于异步名称解析的内部线程数。 如果非零,则在构造第一个解析器对象时创建指定数量的线程。否则,在第一次 |
这些配置选项与执行上下文(如 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);