Linux下编写支持多线程的库

来源:互联网 发布:淘宝怎么看卖家信用 编辑:程序博客网 时间:2024/05/17 13:41

一个进程中,所有线程共享同一个地址空间。所以,如果一个变量是全局的和静态的,那么所有线程访问的是同一份。

一个可执行程序,由下面5部分组成:

  1. 代码段: 由程序的所有代码编译而成的二进制组成,一个进程只有一个副本,只读。
  2. 初始化数据段: 包含所有赋了初值的全局变量组成。
  3. 非初始化数据段:没有被赋初值的全局变量组成。
  4. 栈空间
  5. 堆空间

只有堆栈是每个线程独立地,其他三项都是共享的。

多个线程调用同一个库得到不同的结果,要么把各种参数都独立出来,通过参数传递;

还有一种方式是通过TLS(Thread Local Storage)来声明线程独立地变量实例。 每个线程有64个DWORDS Slots可用。

比如:

一个Log库,支持多个线程,每个线程可以设置log输出的文件,Log的级别等配置。

一种方式是在线程中通过参数把配置传递进去,这样就需要在库的所有接口中都传递参数,
就不可能有一些通用的函数,比如: log_debug、log_error…

另一种方式是,在Log库中,声明一个TLS 全局指针变量,该指针在每个线程中会有一个独立的实例。
在每个线程中,对变量进行赋值操作,后续就可以使用一些通用的接口,而不影响实际独立性。

参考:
http://www.longene.org/forum/viewtopic.php?f=8&t=3916
http://blog.chinaunix.net/uid-24611346-id-3193852.html
http://blog.csdn.net/dog250/article/details/7704898
http://blog.csdn.net/yusiguyuan/article/details/22938671

0 0
原创粉丝点击