
离线 TA的专栏
- 打卡等级:热心大叔
- 打卡总天数:234
- 打卡月天数:0
- 打卡总奖励:3397
- 最近打卡:2025-09-15 12:15:21
|
死锁从文字理论上说明的是两个线程,可以认为是两个人A和B,A在等待B完成某件事情,B又在等待A完成某件事情。
那如果在代码中,单线程的某个函数,有没有可能导致死锁呢?
我们看下面的代码- #include<pthread.h>
- #include<string.h>
- #include<errno.h>
- #include<stdio.h>
- #include<unistd.h>
- pthread_mutex_t mutex;
- int main()
- {
- pthread_mutex_init(&mutex,NULL);
- printf("mutex init\n");
- pthread_mutex_lock(&mutex);
- printf("mutex lock#1\n");
- pthread_mutex_lock(&mutex);
- printf("mutex lock#2\n");
- pthread_mutex_unlock(&mutex);
- pthread_mutex_unlock(&mutex);
- pthread_mutex_destroy(&mutex);
- return 0;
- }
复制代码你看这样的代码会不会导致死锁呢?
线程在上锁后,又马上继续尝试上锁,这样的情况会不会存在?
类似这样的代码- int test_function(void)
- {
- //lock
- do_something()
- if(x) return -1
- //unlock
- }
复制代码 在上锁后,然后下面会因为某种判断后退出,下一次进来后,又会进行上锁,这样的死锁是因为代码逻辑不正确导致的,也是很多新手常犯的问题。
如果是两个线程死锁的情况呢? - #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <pthread.h>
- pthread_mutex_t g_mutex_lock;
- pthread_mutex_t g_mutex_lock2;
- void *func1(void* args)
- {
- printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
- pthread_mutex_lock(&g_mutex_lock);
- sleep(1);
- pthread_mutex_lock(&g_mutex_lock2);
- printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
- pthread_mutex_unlock(&g_mutex_lock);
- pthread_mutex_unlock(&g_mutex_lock2);
- return NULL;
- }
- void *func2(void* args)
- {
- printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
- pthread_mutex_lock(&g_mutex_lock2);
- sleep(1);
- pthread_mutex_lock(&g_mutex_lock);
- printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
- pthread_mutex_unlock(&g_mutex_lock2);
- return NULL;
- }
- int main(void)
- {
- int ret;
- pthread_t thread_1;
- pthread_t thread_2;
- printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
- ret = pthread_mutex_init(&g_mutex_lock, NULL);
- if (ret != 0) {
- printf("mutex init failed\n");
- return -1;
- }
- ret = pthread_mutex_init(&g_mutex_lock2, NULL);
- if (ret != 0) {
- printf("mutex2 init failed\n");
- return -1;
- }
- pthread_create(&thread_1, NULL, func1, NULL);
- pthread_create(&thread_2, NULL, func2, NULL);
- pthread_join(thread_1, NULL);
- pthread_join(thread_2, NULL);
- pthread_mutex_destroy(&g_mutex_lock);
- pthread_mutex_destroy(&g_mutex_lock2);
- printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
- return 0;
- }
复制代码上面的代码比较典型了
线程1拿到1号锁后,开始等待2号锁,线程2拿到2号锁后,就开始等待一号锁。他们属于互相等待的情况。
代码输出- linux@ubuntu:/study$ gcc argc.c -pthread && ./a.outmain(),LINE=37func1(),LINE=11func2(),LINE=23
复制代码最后,线程出现死锁不会正常情况不会导致crash,除非代码上因为加锁存在的一些空指针。
所以单线程也是有可能导致死锁的。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注晓枫资讯的更多内容!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:  进行删除处理。
4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
|