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()函数
有了这个我干嘛还用上面那玩意儿啊=-=