Linux_UNIX编程手册-读书笔记-第三十一章(线程安全和每线程存储)

31.1 线程安全

若函数可同时共多个线程安全调用,则称之为线程安全函数。反之,如果函数不是线程安全的,则不能并发调用。

31.2 一次性初始化

多线程程序有时有这样的需求:不管创建了多少线程,有些初始化动作只能发生一次。在这里插入图片描述
调用pthread_once()时要指定一个指针,指向类型为pthread_once_t的特定变量,对该函数的首次调用将修改once_control所指向的内容,以便对其后续调用不会再次执行init.

31.3 线程特有数据

使用线程特有数据技术,可以无需修改函数接口而实现已有函数的线程安全。

在这里插入图片描述
只要线程终止时与key的关联值不为NULL,PthreadsAPI会自动执行解构函数,并将key的关联值作为参数传入解构函数。传入的值通常时与改键关联,且指向线程特有数据块的指针。

pthread_key_create返回的pthread_key_t类型值只是对全局数组的索引,标记为:pthread_keys.
在这里插入图片描述

这里的两个函数,还没看懂:在这里插入图片描述
使用方法:
书中用了一个函数举例子:
非线程安全版的strerror()函数的一种实现:
在这里插入图片描述
使用线程特有数据以实现线程安全的strerror()函数

在这里插入图片描述
在这里插入图片描述
这两个函数的区别还是挺明显的吧

在这里插入图片描述

31.4 线程局部存储

类似于线程特有数据,线程局部储存提供了持久的每线程存储。
线程局部存储的主要优势在于,比线程特有数据的使用要简单。要创建线程局部变量,只需要简单的在全局或静态变量的声明中包含_thread 说明符即可。
static __thread buf[MAX_ERROR_LEN];

使用线程局部存储实现线程安全版的strerror()函数
在这里插入图片描述
有了这个我干嘛还用上面那玩意儿啊=-=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值