C语言多线程开发中死锁与读写锁问题详解

2022-05-05 10:57:45
目录
死锁
读写锁

死锁

有时,一个线程需要同时访问两个或更多不同的共享资源,而每个资源又都由不同的互斥量管理。当超过一个线程加锁同一组互斥量时,就有可能发生死锁;

两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。

死锁的几种场景:

忘记释放锁
重复加锁(重复加相同的锁)
多线程多锁,抢占锁资源

C语言多线程开发中死锁与读写锁问题详解

//多线程多锁,抢占锁资源 #include <stdio.h> #include <pthread.h> #include <unistd.h> // 创建2个互斥量 pthread_mutex_t mutex1, mutex2; void * workA(void * arg) { pthread_mutex_lock(&mutex1); sleep(1); pthread_mutex_lock(&mutex2); printf("workA....n"); pthread_mutex_unlock(&mutex2); pthread_mutex_unlock(&mutex1); return NULwww.easck.comL; } void * workB(void * arg) { pthread_mutex_lock(&mutex2); sleep(1); pthread_mutwww.easck.comex_lock(&mutex1); printf("workB....n"); pthread_mutex_unlock(&mutex1); pthread_mutex_unlock(&mutex2); return NULL; } int main() { // 初始化互斥量 pthread_mutex_init(&mutex1, NULL); pthread_mutex_init(&mutex2, NULL); // 创建2个子线程 pthread_t tid1, tid2; pthread_create(&tid1, NULL, workA, NULL); pthread_create(&tid2, NULL, workB, NULL); // 回收子线程资源 pthread_join(tid1, NULL); pthread_join(tid2, NULL); // 释放互斥量资源 pthread_mutex_destroy(&mutex1); pthread_mutex_destroy(&mutex2); return 0; }

执行结果:

C语言多线程开发中死锁与读写锁问题详解

读写锁

/* >执行结果:

读时共享,相比互斥锁,提高效率。

C语言多线程开发中死锁与读写锁问题详解

到此这篇关于C语言多线程开发中死锁与读写锁问题详解的文章就介绍到这了,更多相关C语言死锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!