参考网址1:
参考网址2:
可以使用pthread_mutexattr_setrobust()初始化pthread互斥锁.如果持有互斥锁的进程随后死亡,则获取它的下一个线程将接收EOWNERDEAD(但仍然成功获取互斥锁),以便它知道执行任何清理.然后,它需要使用pthread_mutex_consistent()通知所获取的互斥锁再次一致.
代码举例:
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
pthread_mutex_t pth_mutex;
pthread_mutexattr_t attr_pth_mutex;
int size = 1000;循环次数
//互斥强制锁处理函数,如果处于加锁状态而使用锁的线程没有结束,那么就等待,
// 如果处于加锁状态,而使用锁的线程结束了,那么获取到一
// 一个错误号。
void lock_func(void){
int robust_lock_state;
robust_lock_state = pthread_mutex_lock(&pth_mutex);
if(robust_lock_state == EOWNERDEAD){
pthread_mutex_consistent(&pth_mutex);
}
pthread_mutex_unlock(&pth_mutex);
}
//线程a,读取size,并执行size-1操作;
void *ptida_func(void *arg){
lock_func();
while(size>0){
pthread_mutex_lock(&pth_mutex);
printf("%x : %d \n",pthread_self(),size);
size -- ;
pthread_mutex_unlock(&pth_mutex);
}
return NULL;
}
//线程b,读取size,并执行size-1操作
void *ptidb_func(void *arg){
lock_func();
while(size>0){
pthread_mutex_lock(&pth_mutex);
printf("%x : %d \n",pthread_self(),size);
size -- ;
pthread_mutex_unlock(&pth_mutex);
}
return NULL;
}
//模拟一个加锁了,确结束的线程
void *ptidc_func(void *arg){
lock_func();
pthread_mutex_lock(&pth_mutex);
pthread_detach(pthread_self());
return NULL;
}
int main(void){
pthread_t ptida,ptidb,ptidc;
//互斥锁属性初始化
pthread_mutexattr_init(&attr_pth_mutex);
//设置互斥锁属性为强制锁
pthread_mutexattr_setrobust(&attr_pth_mutex,PTHREAD_MUTEX_ROBUST);
//初始化互斥锁
pthread_mutex_init(&pth_mutex,&attr_pth_mutex);
//创建三个线程
pthread_create(&ptidc,NULL,ptidc_func,NULL);
pthread_create(&ptida,NULL,ptida_func,NULL);
pthread_create(&ptidb,NULL,ptidb_func,NULL);
//回收结束线程资源
pthread_join(ptida,NULL);
pthread_join(ptidb,NULL);
return 0;
}