嵌入式工程师面试时可能会问的小问题之互斥量的死锁

嵌入式工程师面试时可能会问的小问题之互斥量的死锁

在面试时,面试官可能会问你在线程中,互斥量什么时候会发生死锁。下面我们用一段代码来诠释这个现象。

#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 *)&param);
        if(ret==0){
                printf("main:creat t1 success\n");
                }
        ret1=pthread_create(&t2,NULL,func2,(void *)&param);
        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手里了,因而两个线程都会阻塞,造成死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值