线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。常见两种情形:
1. 线程试图对同一个互斥量A加锁两次。
pthread_mutex_lock(&mutex);//第1次加锁
printf("hello ");
sleep(1); /*模拟长时间操作共享资源,导致cpu易主,产生与时间有关的错误*/
printf("world\n");
pthread_mutex_lock(&mutex);//第2次加锁,导致程序阻塞在这里
模型如下图:
2. 线程1拥有A锁,请求获得B锁;线程2拥有B锁,请求获得A锁
我在这里列举两个比较常用的方法。
(1)设置等待超时,当一个线程拿起A资源,等待B资源的时候,如果等待的时间过长则超时,释放A资源,重新等待。
(2)如果线程需要AB两个资源,等待A资源的时候阻塞,然后判断B资源是否可以使用,如果B资源正在被别的线程使用,那么该线程就释放A资源,不阻塞,从新排队等待。