单线程会导致死锁吗?

我之前在我们的项目里面解决了一个死锁的问题,然后我跟一个我的朋友聊了下,他让我深入研究下这个问题。大家也可以考虑想我的这个问题。

首先我们再看看什么是死锁?

什么是死锁

用个通俗的例子讲一讲死锁

死锁从文字理论上说明的是两个线程,可以认为是两个人A和B,A在等待B完成某件事情,B又在等待A完成某件事情。

0422692999f4e81a98b7fe4c8a68e21e.png

那如果在代码中,单线程的某个函数,有没有可能导致死锁呢?

我们看下面的代码

#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)
{//lockdo_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.out
main(),LINE=37
func1(),LINE=11
func2(),LINE=23

最后,线程出现死锁不会正常情况不会导致crash,除非代码上因为加锁存在的一些空指针。

所以单线程也是有可能导致死锁的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

细节‘出卖’你

细节‘出卖’你 ①喜欢眨眼&#xff1a;这种人心胸狭隘。②习惯盯着别人看&#xff1a;代表警戒心强。③喜欢提高音量说话&#xff1a;多半是自我主义者。④穿着不拘小节&#xff1a;也代表个性随和。⑤一坐下就翘脚&#xff1a;这种人充满企图心有行动力。⑥边说话边摸下巴&am…

makefile / CMake

- makefile syntax ifneq https://www.gnu.org/software/make/manual/html_node/Conditional-Example.html - [CMake] undef a symbol https://cmake.org/pipermail/cmake/2012-June/050708.html 但是我发现用这个和用remove_definiton对我移植OpenCV的时候都没起作用. https:…

Json的优缺点

JSON的定义 一种轻量级的数据交换格式&#xff0c;具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;&#xff0c;从而可以在不同平台间进行数据交换。JSON…

appcrash事件java,java – SpringBoot应用程序崩溃

请告诉我哪里有问题&#xff1f;我尝试启动我在Spring Boot上开发的第一个应用程序.我已经在SpringMVC上有简单的Web项目,现在我想在BOOT上构建它.这是错误输出&#xff1a;org.springframework.beans.factory.BeanCreationException: Error creating bean with name messageSo…

书摘:35岁之前成功的12条黄金法则

第一章:一个目标 一艘没有航行目标的船&#xff0c;任何方向的风都是逆风1、你为什么是穷人&#xff0c;第一点就是你没有立下成为富人的目标2、你的人生核心目标是什么&#xff1f;杰出人士与平庸之辈的根本差别并不是天赋、机遇&#xff0c;而在于有无目标。3、起跑领先一步…

软件工程师 VS 硬件工程师

因为在软件行业35岁就算老人了而搞硬件的53岁正辉煌表面上看起来高大上的硬件工程师在实际的工作中&#xff0c;其实很惨...以上漫画虽然调侃的意味更多但现实中搞硬件的门槛确实很高收入也会随着经验的增多不断增长硬件工程师也基本不存在中年危机如果实在搞不下去了转项目经理…

假如我们的坦克继续前进队——需求改进系统设计

需求和原型改进 在上个星期的《需求说明书》课堂讨论中&#xff0c;老师提出了游戏的用户界面的设计问题。 经过小组成员的讨论后&#xff0c;我们的想法如下&#xff1a;设计关卡基于时间和人手问题难以实现因此改为一关的形式&#xff0c;以便有更多的时间出开发趣味性更高的…

瑞星2009:3大拦截2大防御功能主动遏制木马病毒

12月16日&#xff0c;“瑞星全功能安全软件2009”正式发布&#xff0c;它基于瑞星“云安全”技术开发&#xff0c;实现了彻底的互联网化&#xff0c;是一款超越了传统“杀毒软件”的划时代安全产品。该产品集“拦截、防御、查杀、保护”多重防护功能于一身&#xff0c;并将杀毒…

Android中使用软引用和弱引用避免OOM的方法

个人总结如下&#xff1a; 4种类型的引用 由高到低依次为&#xff1a;强引用>软引用>弱引用>虚引用 (1)、强引用 如&#xff1a;Object objectnew Object&#xff08;&#xff09;&#xff0c;object就是一个强引用了。 当内存空间不足&#xff0c;Java虚拟机宁愿…

DIY一个低成本多功能点阵时钟!

大家好&#xff0c;转发一篇正念同学的文章----大家好&#xff0c;我是ZhengN。本次转载一篇保姆级的diy教程&#xff1a;基于Esp8266的多功能点阵时钟 。简介很早就了解ESP8266了&#xff0c;当时也用这个搞过一些小demo&#xff0c;一直也没有想过要弄些实际的作品出来&#…

从DataTable导出Excel,并下载,删除Excel进程。

页面上加入一个button即可.源代码如下: usingSystem;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Web;usingSystem.Web.SessionState;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.HtmlC…

Traceroute(路由追踪)的原理及实现

现实世界中的网络是由无数的计算机和路由器组成的一张的大网&#xff0c;应用的数据包在发送到服务器之前都要经过层层的路由转发。而Traceroute是一种常规的网络分析工具&#xff0c;用来定位到目标主机之间的所有路由器 原理 在介绍Traceroute的原理之前&#xff0c;需要了解…

社交网站与网民隐私安全报告(2009)

社交网站与网民隐私安全报告&#xff08;2009&#xff09; 免责声明&#xff1a; 本报告主要内容来自瑞星客户服务中心和瑞星互联网攻防实验室的调查和研究成果&#xff0c;部分数据来自来自瑞星“云安全”系统&#xff0c;仅针对网民在使用国内社交网站&#xff08;SNS&#x…

Intent传递数据时,可以传递哪些类型数据

Intent传递数据时&#xff0c;下列的数据类型哪些可以被传递&#xff08;abcd&#xff09;(多选) A、Serializable B、charsequence C、Parcelable D、Bundle 除了上面的还能传递基本数据类型(byte/boolean/char/short/int/float/long/double)、String/StringBuffer/StringBu…

周记之琢磨下计算机网络(2018/10/22-2018/10/28)

网络&#xff0c;就如同空气一样&#xff0c;我们身处其中&#xff0c;却对它的存在司空见惯&#xff0c;从未察觉&#xff0c;而计算机网络这门课&#xff0c;的确让我看到了它的本来面目&#xff0c;它的五大层次&#xff08;从上往下&#xff09;&#xff1a;应用层、传输层…

我们应该搞清楚分支预测

分支预测的英文名字是「Branch Prediction」大家可以在Google上搜索这个关键字&#xff0c;可以看到关于分支预测的很多内容&#xff0c;不过要搞清楚分支预测如何工作的&#xff0c;才是问题的关键。分支预测对程序的影响我们来看看下面的两段代码代码1#include <algorithm…

Intent介绍及Intent在Activity中的使用方法

1.Intent的实现过程   在Android中&#xff0c;Intent不仅可用于应用程序之间的交互&#xff0c;也可用于应用程序内部的Activity/Service之间的交互。   Intent负责对应用中一次操作进行描述&#xff0c;描述内容包括动作以及动作所涉及的数据&#xff0c;Android中的In…

java 程序中打开文件和文件夹

打开文件 //打开工具的路径及名字 String toolsPath "C:/WINDOWS/system32/notepad.exe "; //被打开文件的路径及名字 String fileName "test.txt"; try { Runtime.getRuntime().exec(toolsPathfileName); } catch (IOException e) { // TODO Aut…

php函数可变参数列表,PHP函数可变参数列表的具体实现方法介绍

也许对于PHP初级程序员来说&#xff0c;对于PHP函数并不能完全熟练的掌握。我们今天为大家介绍的PHP函数可变参数列表的实现方法主要是利用func_get_args()、 func_num_args()、func_get_arg()这三个系统函数来实现的&#xff0c;其中func_get_args()函数以数组的形式获得参数列…

程序结束后去哪儿了?

大家好&#xff0c;我是写代码的篮球球痴&#xff0c;转发一篇卓老师的文章&#xff0c;文章中的内容我之前做单片机的时候也有遇到过。推荐给大家看看~简 介&#xff1a; 对于嵌入式系统&#xff0c;如果没有运行RTOS&#xff0c;那么程序开发中的 主函数&#xff08;main()&a…