APUE里关于线程属性与及同步属性的记录与理解

12章

线程属性

在这里插入图片描述

以分离状态创建线程

...
//定义一个 pthread_attr_t 
pthread_attr_t attr;

err = pthread_attr_init(&attr);
...
err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
...
	err = pthread_create(&tid, &attr, fnm, arg);
	
pthread_attr_destroy(&attr);
...

线程栈属性 如栈地址 栈大小 可以通过 pthread_attr_getstack(…) 获取。

同步属性

互斥锁

值得注意的是3个属性:
进程共享

健壮

在这里插入图片描述

该函数主要针对 健壮的互斥锁


对thread的mutex,可以通过方法 pthread_mutexattr_setrobust()来设置健壮性属性

属性为:PTHREAD_MUTEX_ROBUST

通过设置锁的上面D 属性,我们就改变了默认的行为。

当一个锁的owner死掉后,其它线程再去lock这个锁的时候,不会被阻塞,而是通过返回值EOWNERDEAD来报告错误。

那么你可以根据这个错误来进行处理:首先是应该调用pthread_mutex_consistent函数来恢复该锁的一致性,

然后调用解锁pthread_mutex_unlock,

接下来在调用加锁,这样该锁的行为就恢复正常了。

如果上面这个函数在恢复锁的一致性时候没有成功,那么你只需要调用解锁函数就OK了,然后直接返回,而不要去调用加锁函数。

那么接下来的线程在调用加锁函数的时候,会得到返回值ENOTRECOVERABLE,

那么需要你做的就是调用pthread_mutex_destroy来destroy掉该锁,然后重新用锁的属性和锁的初始化函数来重新初始化该锁。

上面的这些解决死锁方式比较适合在系统中只有一个锁的情况,如果系统的死锁是由于多把锁的资源互相等待而造成的,那么这种解决方式无能为力。。。

类型

在这里插入图片描述

互斥锁的递归 书上有场景。

在检查条件时需要占用互斥量,如果条件发生,创建线程重试(retry 也需要占用锁),由于是同一个锁,除非锁是递归的,否则就会导致死锁。

读写锁

读写锁属性只有进程共享属性。

条件变量属性

有进程共享 和 时钟属性

屏障属性

只有进程共享

重入

如果一个函数 在相同的时间点 可以被多个线程安全的调用, 那么该函数就是线程安全的。

但是线程安全函数,不一定对信号处理程序是可重入的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值