Skip to content

Commit f521d13

Browse files
committed
Update README.md
1 parent d96f4b7 commit f521d13

File tree

1 file changed

+58
-28
lines changed

1 file changed

+58
-28
lines changed

README.md

Lines changed: 58 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
### libgo - 协程库、并行编程库
66

7-
libgo是一个使用C++11编写的调度式stackful协程库,
7+
libgo是一个使用C++11编写的协作式调度的stackful协程库,
88

99
同时也是一个强大的并行编程库, 是专为Linux服务端程序开发设计的底层框架。
1010

@@ -19,8 +19,8 @@ libgo是一个使用C++11编写的调度式stackful协程库,
1919
libgo有以下特点:
2020

2121
* 1.提供golang一般功能强大协程,基于corontine编写代码,可以以同步的方式编写简单的代码,同时获得异步的性能,
22-
* 2.支持海量协程, 创建100万个协程只需使用1GB内存
23-
* 3.允许用户自由控制协程调度点,随意变更调度线程数
22+
* 2.支持海量协程, 创建100万个协程只需使用2GB内存
23+
* 3.允许用户自由控制协程调度点,随时随地变更调度线程数
2424
* 4.支持多线程调度协程,极易编写并行代码,高效的并行调度算法,可以有效利用多个CPU核心
2525
* 5.可以让链接进程序的同步的第三方库变为异步调用,大大提升其性能。再也不用担心某些DB官方不提供异步driver了,比如hiredis、mysqlclient这种客户端驱动可以直接使用,并且可以得到不输于异步driver的性能。
2626
* 6.动态链接和静态链接全都支持,便于使用C++11的用户静态链接生成可执行文件并部署至低版本的linux系统上。
@@ -36,46 +36,78 @@ libgo有以下特点:
3636
##### libgo的编译与使用:
3737

3838
* Linux:
39+
40+
0.CMake编译参数
41+
42+
ENABLE_BOOST_COROUTINE
43+
libgo在Linux系统上默认使用ucontext做协程上下文切换,开启此选项将使用boost.coroutine来替代ucontext.
44+
使用方式:
45+
$ cmake .. -DENABLE_BOOST_COROUTINE=1
46+
47+
ENABLE_SHARED_STACK
48+
使用ucontext做协程上下文切换时可以开启此选项,开启后多个协程将共享使用同一个栈,这个选项可以大概节约4倍的内存.
49+
但是会有一定的副作用,参见下面的WARNNING第四条.
50+
在使用ENABLE_BOOST_COROUTINE选项时, 此选项不可开启
51+
使用方式:
52+
$ cmake .. -DENABLE_SHARED_STACK=1
53+
54+
DISABLE_HOOK
55+
禁止hook syscall,开启此选项后,网络io相关的syscall将恢复系统默认的行为,
56+
协程中使用阻塞式网络io将可能真正阻塞线程,如无特殊需求请勿开启此选项.
57+
使用方式:
58+
$ cmake .. -DDISABLE_HOOK=1
3959

40-
0.如果你安装了ucorf,那么你已经安装过libgo了,可以跳过第1步.
60+
1.如果你安装了ucorf,那么你已经使用默认的方式安装过libgo了,如果不想设置如上的选项,可以跳过第2步.
4161

42-
1.使用CMake进行编译安装:
62+
2.使用CMake进行编译安装:
4363

4464
$ mkdir build
4565
$ cd build
46-
$ cmake .. -DCMAKE_BUILD_TYPE=RELEASE
47-
$ sudo make install
48-
49-
如果希望编译可调试的版本, 只需要cmake那行命令变为:
50-
5166
$ cmake ..
52-
53-
如果想要使用boost.coroutine作为底层上下文切换(不再是共享栈, 会浪费内存但是不存在第4条WARN的问题),编译命令为:
54-
55-
调试: $ cmake .. -DENABLE_BOOST_COROUTINE=1
56-
优化: $ cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DENABLE_BOOST_COROUTINE=1
67+
$ sudo make install
5768

58-
如果不希望使用Hook功能,可以使用以下命令进行编译:
69+
如果希望编译可调试的版本, "cmake .." 命令执行完毕后执行:
5970

60-
调试: $ cmake .. -DDISABLE_HOOK=1
61-
优化: $ cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DDISABLE_HOOK=1
71+
$ make debug
72+
$ sudo make install
6273

6374
执行单元测试代码:
6475

6576
$ make test
66-
$ ./test.t
77+
$ make run_test
78+
79+
生成性能网络测试代码:
6780

68-
2.以动态链接的方式使用时,一定要最先链接liblibgo.so,还需要链接libdl.so. 例如:
81+
$ make bm
82+
83+
3.以动态链接的方式使用时,一定要最先链接liblibgo.so,还需要链接libdl.so.
84+
例如:
6985
7086
g++ -std=c++11 test.cpp -llibgo -ldl [-lother_libs]
7187
72-
3.以静态链接的方式使用时,只需链接liblibgo.a即可,不要求第一个被链接,但要求libc.a最后被链接. 例如:
88+
4.以静态链接的方式使用时,只需链接liblibgo.a即可,不要求第一个被链接,但要求libc.a最后被链接.
89+
要求安装GCC的静态链接库, debian系Linux安装gcc时已经自带, redhat系Linux需要从源中另行安装(yum install gcc-static)
90+
例如:
7391
7492
g++ -std=c++11 test.cpp -llibgo -static -static-libgcc -static-libstdc++
7593

7694
* Windows:
95+
96+
0.CMake编译参数
97+
98+
ENABLE_BOOST_COROUTINE
99+
libgo在Windows系统上默认使用fiber做协程上下文切换,开启此选项将使用boost.coroutine来替代fiber.
100+
!!! 然而并不建议开启此选项, boost.coroutine在Windows系统上的稳定性不如fiber.
101+
使用方式:
102+
$ cmake .. -DENABLE_BOOST_COROUTINE=1
103+
104+
DISABLE_HOOK
105+
禁止hook syscall,开启此选项后,网络io相关的syscall将恢复系统默认的行为,
106+
协程中使用阻塞式网络io将可能真正阻塞线程,如无特殊需求请勿开启此选项.
107+
使用方式:
108+
$ cmake .. -DDISABLE_HOOK=1
77109

78-
1.使用git submodule update --init下载子模块
110+
1.使用git submodule update --init --recursive下载Hook子模块
79111
80112
2.使用CMake构建工程文件.
81113
@@ -84,20 +116,18 @@ libgo有以下特点:
84116

85117
比如vs2015(x86):
86118
$ cmake .. -G"Visual Studio 14 2015"
87-
88-
其他编译参数参见Linux平台的编译方式
89119
90-
3.使用时需要添加两个include目录:coroutine和coroutine/windows
120+
3.使用时需要添加两个include目录:src和src/windows, 或将这两个目录下的头文件拷贝出来使用
91121

92122
##### 注意事项(WARNING):
123+
*
93124

94-
95-
1.在多线程模式下不要使用<线程局部变量>。使用多线程调度时,协程的每次切换,下一次继续执行都可能处于其他线程中
125+
1.在多线程调度模式下不要使用<线程局部变量(TLS)>。使用多线程调度时,协程的每次切换,下一次继续执行都可能处于其他线程中
96126

97127
2.不要让一个代码段耗时过长。协程的调度是协作式调度,需要协程主动让出执行权,推荐在耗时很长的循环中插入一些yield
98128

99129
3.除网络IO、sleep以外的阻塞系统调用,会真正阻塞调度线程的运行,请使用co_await, 并启动几个线程去Run内置的线程池.
100130

101-
4.在Linux系统上且不使用ENABLE_BOOST_COROUTINE参数时,协程栈上对象不可被协程外部访问
131+
4.未定义行为:在Linux系统上开启了ENABLE_SHARED_STACK参数时,协程栈上的对象不可被协程外部访问
102132
由于采用共享栈的方式调度协程,协程处于非执行状态时,栈上对象会被保存到另外一块内存中,因此会失效,
103133
此时通过保存的地址访问栈上对象是一种未定义行为。有共享需求的对象请将其置于堆上或使用channel。

0 commit comments

Comments
 (0)