@@ -7,16 +7,13 @@ title: "FAQ"
7
7
8
8
## 如何修改配置项的值?
9
9
10
- ** [ flag] ( ../flag/ ) ** 是 coost 提供的命令行参数与配置文件解析库。coost 中的日志、协程、网络等模块使用 flag 定义了一些配置项,用户可以 ** 通过命令行参数或配置文件修改配置项的值 ** 。命令行中的用法见 [ 命令行中使用 flag] ( ../flag/#命令行中使用-flag ) ,配置文件的用法见 [ 配置文件] ( ../flag/#配置文件 ) 。需要注意, ** 修改配置项需要在 main 函数开头调用 [ flag::parse ] ( ../flag/#flagparse ) 解析命令行参数 ** 。
10
+ ** [ flag] ( ../flag/ ) ** 是 coost 中的配置管理组件,它定义的配置项(也称flag),可以 ** 通过命令行参数或配置文件修改 ** ,具体用法见 [ 命令行中使用 flag] ( ../flag/#命令行中使用-flag ) 及 [ 配置文件] ( ../flag/#配置文件 ) 。
11
11
12
- ``` cpp
13
- int main (int argc, char** argv) {
14
- flag::parse(argc, argv);
15
- return 0;
16
- }
17
- ```
12
+ {{< hint warning >}}
13
+ 使用 flag 库需要在 main 函数开头调用 [ flag::parse] ( ../flag/#flagparse ) 解析命令行参数。
14
+ {{< /hint >}}
18
15
19
- 用户也可以通过 API [flag::set_value](../flag/#flagset_value) 修改配置项的值:
16
+ 另外也可以通过 API [ flag::set_value] ( ../flag/#flagset_value ) 修改配置项的值:
20
17
21
18
``` cpp
22
19
int main (int argc, char** argv) {
@@ -28,7 +25,7 @@ int main(int argc, char** argv) {
28
25
```
29
26
30
27
{{< hint info >}}
31
- ` flag::set_value ` 在 ` flag::parse ` 之前,这样用户仍然能够通过命令行参数、配置文件修改相关配置项的值。
28
+ 此处 `flag::set_value` 在 `flag::parse` 之前,这样用户仍然能够通过命令行参数、配置文件修改相关配置项的值。
32
29
{{< /hint >}}
33
30
34
31
@@ -53,7 +50,7 @@ int main(int argc, char** argv) {
53
50
54
51
## 如何使用 flag 别名?
55
52
56
- [ flag] ( ../flag/ ) 支持别名,定义了别名的 flag,在命令行参数、配置文件中,可以用别名取代原名。 flag 别名有两种用法 ,第一种是在定义 flag 时指定别名 :
53
+ [ flag] ( ../flag/ ) 支持别名,定义了别名的 flag,在命令行参数、配置文件中,可以用别名代替原名。给 flag 添加别名有两种方法 ,第一种是在定义 flag 时指定 :
57
54
58
55
59
56
``` cpp
@@ -62,7 +59,7 @@ DEF_bool(debug, false, "xxx", d); // 别名 d
62
59
DEF_bool(debug, false, "xxx", d, dbg); // 两个别名: d, dbg
63
60
```
64
61
65
- 还有一种情况,flag 已经定义,且用户无法修改 flag 的定义时 ,可以用 [flag::alias](../flag/#flagalias) 设置别名,如 coost 内部定义了 string 类型的 flag `version`,用户可以用如下方式给它设置别名:
62
+ 还有一种情况,flag 已经定义,且用户无法修改该定义时 ,可以用 [flag::alias](../flag/#flagalias) 设置别名,如 coost 内部定义的 string 类型的 flag `version`,用户可以用如下方式给它设置别名:
66
63
67
64
```cpp
68
65
int main(int argc, char** argv) {
@@ -110,7 +107,7 @@ coost v3.0.1 基于 flex 与 [byacc](https://invisible-island.net/byacc/) 重写
110
107
111
108
**频繁创建、销毁线程是设计上的错误。**
112
109
113
- coost 中使用了 TLS (线程局部存储),频繁创建、销毁线程时 ,一些 TLS 资源在线程退出时并不会自动销毁,从而导致内存泄露。
110
+ coost 中使用了 TLS (线程局部存储),频繁创建、销毁线程 ,一些 TLS 资源在线程退出时并不会自动销毁,从而导致内存泄露。
114
111
115
112
尽管 C++ 标准中的 `thread_local`,可以保证 TLS 对象在线程退出时自动析构,但是**在线程退出时析构 TLS 对象并不总是正确的行为**,如基于 TLS 实现的内存分配器,一个线程退出时,该线程中分配的内存,可能还在被其他线程使用,这个时候释放该线程的 TLS 资源,可能会导致程序崩溃。
116
113
@@ -130,7 +127,7 @@ coost 中协程支持多线程调度,默认线程数为系统 CPU 核数,用
130
127
131
128
## 协程是否会出现栈溢出?
132
129
133
- coost 协程默认栈大小为 `1M`,足够大,一般不会出现栈溢出。如果 1M 不够,用户可 [通过配置项改大一些](../concurrency/coroutine/conf/#co_stack_size)。
130
+ coost 协程默认栈大小为 `1M`,足够大,一般不会出现栈溢出。如果 1M 不够,可以 [通过配置项改大一些](../concurrency/coroutine/conf/#co_stack_size)。
134
131
135
132
136
133
@@ -146,7 +143,7 @@ coost 协程 hook 了系统 socket 相关 API,可以在协程中直接使用 m
146
143
147
144
148
145
149
- ## 如何将主线程变成协程调度线程 ?
146
+ ## 主线程可以设置成协程调度线程吗 ?
150
147
151
148
coost 中调度线程默认是独立于主线程运行的,可借助 [co::main_sched](../concurrency/coroutine/api/#comain_sched) 将主线程设置为协程调度线程:
152
149
@@ -170,5 +167,5 @@ int main(int argc, char** argv) {
170
167
```
171
168
172
169
{{< hint warning >}}
173
- 须在** 创建协程之前** 调用 ` co::main_sched ` (该方法返回指向 ` MainSched ` 的指针 ) 将主线程标记为调度线程,创建协程后,再调用 ` MainSched ` 的 ` loop ` 方法启动该协程调度器。
170
+ 须在** 创建协程之前** 调用 ` co::main_sched ` (该方法返回 ` MainSched ` 指针 ) 将主线程标记为调度线程,创建协程后,再调用 ` MainSched ` 的 ` loop ` 方法启动该协程调度器。
174
171
{{< /hint >}}
0 commit comments