Linux下编写支持多线程的库

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

一个可执行程序,由下面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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值