嵌入式工程师面试时可能会问的小问题之互斥量的死锁
在面试时,面试官可能会问你在线程中,互斥量什么时候会发生死锁。下面我们用一段代码来诠释这个现象。
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex1;
//定义两把锁
pthread_mutex_t mutex2;
int data=0;
void *func1(void *arg)
{
int i=0;
pthread_mutex_lock(&mutex1);//线程1获取第一把锁
sleep(1);//睡眠1s抱枕线程2能拿到第二把锁
pthread_mutex_lock(&mutex2);//此时第二把锁已经被线程拿走,线程1怎么也获取不到锁,因而程序阻塞。
printf("t1:%ld thread is creat\n",(unsigned long)pthread_self());
printf("t1 param is %d\n",*((int *)arg));
while(1){
printf("t1 data=%d\n",data++);
sleep(1);
if(data==3)
{
pthread_mutex_unlock(&mutex1);
pthread_exit(NULL);
}
}
}
void *func2(void *arg)
{
pthread_mutex_lock(&mutex2);//线程2获取第二把锁
sleep(1);
pthread_mutex_lock(&mutex1);//此时第一锁已经被线程1拿走,因而线程2也阻塞。
printf("t2:%ld thread is creat\n",(unsigned long)pthread_self());
printf("t2 param is %d\n",*((int *)arg));
while(1){
printf("t2:data=%d\n",data);
data++;
sleep(1);
}
}
int main()
{
int ret;
int ret1;
int param=100;
pthread_mutex_init(&mutex1,NULL);
pthread_mutex_init(&mutex2,NULL);
pthread_t t1;
pthread_t t2;
ret=pthread_create(&t1,NULL,func1,(void *)¶m);
if(ret==0){
printf("main:creat t1 success\n");
}
ret1=pthread_create(&t2,NULL,func2,(void *)¶m);
if(ret1==0){
printf("main:creat t2 success\n");
}
printf("main:%ld\n",(unsigned long)pthread_self());
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_mutex_destroy(&mutex1);
pthread_mutex_destroy(&mutex2);
return 0;
}
当线程1获取到第一把锁时,睡眠1s,让线程2拿到第二把锁,然后此时线程1再去获取第二把锁,此时第二把锁已经再线程2手里了,因而两个线程都会阻塞,造成死锁。