您的当前位置:首页正文

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

2024-11-09 来源:个人技术集锦

参考网址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;
}

Top