前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

死锁

作者头像
lexingsen
发布2022-05-06 20:25:26
5730
发布2022-05-06 20:25:26
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客

死锁产生的原因有两个: 1.多进程或多线程对不可剥夺的软硬件资源进行的竞争 2.操作系统内核对于多个进程推进顺序的非法,多个进程对于资源的请求与释放的顺序不正确,造成资源的死锁。

程序员对信号量的使用不当,造成应用程序内部多进程或多线程的死锁。 程序员对互斥锁的使用不当,也会造成死锁,自己锁自己,这里的死锁并不是操作系统意义上的死锁,而是编程层面未对互斥锁成对(lock unlock)使用造成的。

代码语言:javascript
复制
#include <thread>
#include <semaphore.h>
#include <iostream>
#include <unistd.h>
using namespace std;

sem_t s1, s2; // 两个用于同步的信号量
int main() {
	sem_init(&s1, 0, 0);
	sem_init(&s2, 0, 0);
	thread t1([&](){
		sem_wait(&s2);  // 请求持有s2 陷入阻塞
		cout << "hello" << endl;
		sem_post(&s1);  // 持有s1 但不能释放
	});
	
	thread t2([&](){
		sem_wait(&s1); // 请求持有s1  陷入阻塞
		cout << "hello" << endl;
		sem_post(&s2); // 持有s2 但不能释放
	});
	
	sem_destroy(&s1);
	sem_destroy(&s2);
	return 0;
}
在这里插入图片描述
在这里插入图片描述

上述两个两个线程分别持有一个信号量,但是又请求占用对方的信号量。 满足互斥条件,满足不可剥夺条件,满足请求保持条件,满足循环等待条件,最终造成两个线程死锁,在无外力条件的破坏的情况下,两线程将永远不会向前推进。

代码语言:javascript
复制
#include <pthread.h>
#include <unistd.h>

pthread_mutex_t mtx;
int x=10;

int main() {
	pthread_mutex_init(&mtx, NULL);
	pthread_mutex_lock(&mtx);// 对mutex加锁成功 
	pthread_mutex_lock(&mtx);
	// 还未对mutex解锁 将会永久阻塞
	x += 100;
	pthread_mutex_unlock(&mtx);
	pthread_mutex_destroy(&mtx);
	return 0;
}

死锁预防 死锁预防的本质就是釜底抽薪,直接从根本上干掉死锁,避免死锁的发生。破坏死锁的四个必要条件的一个或多个。 互斥条件:几乎不可行

不可剥夺条件:强行剥夺,是要付出代价的。强行剥夺可能会造成进程或线程前一段工作的失效,只适用在一些易于保存和恢复的资源。

请求和保持条件:代价太高,一次性分配完,系统没有那么多资源,造成资源的浪费。

循环等待条件:顺序资源分配 资源递增编号 进程或线程按序申请使用资源

死锁避免 银行家算法

死锁检测与解除 死锁定理+资源分配图

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档