Linux基本线程编程(二)

分离线程
pthread_detach(3C)是pthread_join(3C)的替代函数,可回收创建时detachstate属性设置为PTHREAD_CREATE_JOINABLE的线程的存储空间。
pthread_detach语法
int pthread_detach(thread_t tid);

#include <pthread.h>
pthread_t tid;
int ret;

/* detach thread tid */
ret = pthread_detach(tid);

pthread_detach()函数用于指示应用程序在线程tid终止时回收其存储空间。如果tid尚未终止,pthread_detach()不会终止该线程。
pthread_detach返回值
pthread_detach()在调用成功完成之后返回零。其他任何返回值都表示出现了错误。如果
检测到以下任一情况,pthread_detach()将失败并返回相应的值。
EINVAL
描述: tid是分离线程。
ESRCH
描述: tid不是当前进程中有效的未分离的线程。
为线程特定数据创建键
单线程C程序有两类基本数据:局部数据和全局数据。对于多线程C程序,添加了第三类数据:线程特定数据。线程特定数据与全局数据非常相似,区别在于前者为线程专有。
线程特定数据基于每线程进行维护。TSD(特定于线程的数据)是定义和引用线程专用数据的唯一方法。每个线程特定数据项都与一个作用于进程内所有线程的键关联。通过使用key,线程可以访问基于每线程进行维护的指针(void*)。
线程库

pthread_key_create语法
int pthread_key_create(pthread_key_t *key,
void (destructor) (void ));

#include <pthread.h>
pthread_key_t key;
int ret;
/* key create without destructor */
ret = pthread_key_create(&key, NULL);
/* key create with destructor */
ret = pthread_key_create(&key, destructor);

可以使用pthread_key_create(3C)分配用于标识进程中线程特定数据的键。键对进程中的所有线程来说是全局的。创建线程特定数据时,所有线程最初都具有与该键关联的NULL值。
使用各个键之前,会针对其调用一次pthread_key_create()。不存在对键(为进程中所有的线程所共享)的隐含同步。
创建键之后,每个线程都会将一个值绑定到该键。这些值特定于线程并且针对每个线程单独维护。如果创建该键时指定了destructor函数,则该线程终止时,系统会解除针对每线
程的绑定。
当pthread_key_create()成功返回时,会将已分配的键存储在key指向的位置中。调用方必须确保对该键的存储和访问进行正确的同步。
使用可选的析构函数destructor可以释放过时的存储。如果某个键具有非NULLdestructor函数,而线程具有一个与该键关联的非NULL值,则该线程退出时,系统将使用当前的相关值调用destructor函数。destructor函数的调用顺序不确定。
pthread_key_create返回值
pthread_key_create()在成功完成之后返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,pthread_key_create()将失败并返回相应的值。
线程库
第2章 • 基本线程编程 29
EAGAIN
描述: key名称空间已经用完。
ENOMEM
描述: 此进程中虚拟内存不足,无法创建新键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值