进程崩溃后,共享内存中的锁不释放

参考网址1:一个用户崩溃时共享内存中的互斥锁? | 那些遇到过的问题

参考网址2:多线程使用基础篇(四)互斥锁的使用方法:pthread_mutex_init() pthread_mutextattr_init() pthread_mutexattr_setroubest()...-CSDN博客

可以使用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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值