单线程会导致死锁吗?

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

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

什么是死锁

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

死锁从文字理论上说明的是两个线程,可以认为是两个人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,一经查实,立即删除!

相关文章

Json的优缺点

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

软件工程师 VS 硬件工程师

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

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

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

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;需要了解…

我们应该搞清楚分支预测

分支预测的英文名字是「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…

程序结束后去哪儿了?

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

CodeSmith终极玩法

CodeSmith是一个模仿asp.net运行机制的代码生成器, 运行时分析模板(相当aspx文件)的预编译指令和主体内容, 生成一个继承自CodeSmith.Engine.CodeTemplate(相当于System.Web.UI.Page)或者一个在Inherites预编译指令指定的类(相当于CodeBehind类)的源码, 且把它编译. 然后把这个…

bom与dom

区别 BOM&#xff08;Browser Object Model&#xff09; BOM 即浏览器对象模型&#xff0c;BOM没有相关标准&#xff0c;BOM的最核心对象是window对象。window对象既为javascript访问浏览器提供API&#xff0c;同时在ECMAScript中充当Global对象。BOM和浏览器关系密切&#xff…

有些事不用听别人的

今天在群里跟几个朋友聊天&#xff0c;然后说了自己的想法&#xff0c;最近很多人在说公众号不会有好的发展&#xff0c;写文章也是没有出路的。不过这个是事实。短视频才是可能是出路&#xff0c;短视频是个很大的蛋糕&#xff0c;从表达方式上来说&#xff0c;视频的表达方式…

25个优秀的设计机构网站设计案例

今天&#xff0c;我们一起来欣赏网站设计工作室自己的网站。设计公司的网站除了要能够吸引客户以外&#xff0c;还要通过他们自己的网站向客户展示他们的设计理念和风格。这里收集的25个优秀的设计机构网站既有清爽简洁风格的&#xff0c;也有色彩丰富&#xff0c;图文并茂的&a…

一个适用各类场合的Makefile模板

1.写在前面对于Windows下开发&#xff0c;很多IDE都集成了编译器&#xff0c;如Visual Studio&#xff0c;提供了“一键编译”&#xff0c;编码完成后只需一个操作即可完成编译、链接、生成目标文件。Linux开发与Windows不同&#xff0c;Linux下一般用的的gcc/g编译器&#xff…

毕业十年|我的嵌入式AI学习路线(笔记、代码)

嵌入式从业者接下来会有怎样的黄金十年&#xff1f;在物联网和人工智能的促进下&#xff0c;嵌入式在未来的5-10年内会迎来更多的发展机会&#xff0c;一方面嵌入式开发会迎来更多的应用场景&#xff0c;另一方面嵌入式开发的技术体系也会逐渐丰富&#xff0c;从而拓展物联网开…

在艰苦年代,买不起万用表,怎么测量电路电压?

如何测量电压&#xff1f;有这样一张图片&#xff1a;用舌头来测量&#xff1f;开玩笑的吧&#xff01;不过这张照片勾起了我的回忆&#xff1a;有一位玩电子的老前辈&#xff0c;现在已经70多岁了。和他聊天&#xff0c;他说&#xff0c;当年他们玩电子&#xff0c;条件非常艰…

VBA学习_5:流程控制

1、If If Range("B2").Value >60 Then Range("C2").Value "及格" Else Range("C2").Value"不及格"如果。。。那么。。。。否则。。。。 If Range("B2").Value > 60 ThenRange("C2").Value "…

嵌入式的薪资还是挺低的

我最近和一个比较好的朋友聊天&#xff0c;我这个朋友在一家比较传统的公司&#xff0c;在这个公司做嵌入式软件开发&#xff0c;偏系统方向的。然后最近拿到了几个不错的offer&#xff0c;让我帮忙看看。这几个offer我就不发出来给大家看了。可以肯定的是&#xff0c;这几个of…

新手必看!单片机掉电检测与数据掉电保存方案

单片机在正常工作时&#xff0c;因某种原因造成突然掉电&#xff0c;将会丢失数据存储器&#xff08;RAM&#xff09;里的数据。在某些应用场合如测量、控制等领域&#xff0c;单片机正常工作中采集和运算出一些重要数据&#xff0c;待下次上电后需要恢复这些重要数据。因此&am…

Study Notes ASP.Net 之Theme Skin

基本概念&#xff1a; Theme 和 Skin用以定义页面中各个控件的显示样式&#xff0c;如字体大小&#xff0c;前/后景色等等。一个Theme可以包括多个Skin&#xff0c;一个Skin可以定义多个控件的样式。目的&#xff1a; 使得页面样式的制作可以与页面制作分工进行。<?xml:nam…