互斥锁什么时候发生死锁?
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁,尽管死锁很少发生,但一旦发生就会造成应用的停止响应。
注:死锁一般发生在程序存在2个锁以上的情况。
实例:
#include <stdio.h>
#include <pthread.h>
//int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
int a=0;
pthread_mutex_t mutex;
pthread_mutex_t mutex2;
void *func1(void *arg)
{
pthread_mutex_lock(&mutex);//锁1上锁
sleep(1);
pthread_mutex_lock(&mutex2);//锁2上锁
a++;
printf("t1:a=%d\n",a++);
printf("t1:a=%d\n",a);
pthread_mutex_unlock(&mutex);
}
void *func2(void *arg)
{
pthread_mutex_lock(&mutex2);//锁2上锁
sleep(1);
pthread_mutex_lock(&mutex);//锁1上锁
a++;
printf("t2:a=%d\n",a++);
printf("t2:a=%d\n",a);
pthread_mutex_unlock(&mutex);
}
int main()
{
int ret1=0;
int ret2=0;
pthread_t t1;
pthread_t t2;
pthread_mutex_init(&mutex, NULL);
pthread_mutex_init(&mutex2, NULL);
ret1=pthread_create(&t1,NULL,func1,NULL);
ret2=pthread_create(&t2,NULL,func2,NULL);
if((ret1||ret2)!=0){
printf("main:create thread failure\n");
}
a++;
printf("main:a=%d\n",a);
sleep(2);
pthread_mutex_destroy(&mutex);
return 0;
}
实验结果:
线程1和线程2被锁死
实验解析: