当前位置: 首页 > news >正文

软件下载网站哪个好哪有恶意点击软件买的

软件下载网站哪个好,哪有恶意点击软件买的,手工品外贸出口网站建设方案,高州做网站死锁的概念 在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。 那…

死锁的概念

在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。

那么,当两个线程为了保护两个不同的共享资源而使用了两个互斥锁,那么这两个互斥锁应用不当的时候,可能会造成两个线程都在等待对方释放锁,在没有外力的作用下,这些次线程会一直相互等待,就没法继续运行,这种情况就是发生了死锁

死锁必须同时满足以下四个条件才会发生:

  • 互斥条件
  • 持有并等待条件
  • 不可剥夺条件
  • 环路等待条件

互斥条件

互斥条件式指多个线程不能同时使用同一个资源

eg:如果线程A已经持有的资源,不能同时被线程B持有,如果线程B请求获取线程A已经占用的资源,那线程B只能等待,直到线程A释放了资源。

 持有并等待条件

持有并等待条件是指,当线程 A 已经持有了资源 1 ,又想申请资源 2 ,而资源 2 已经被线程 C 持有了,所以线程 A 就会处于等待状态,但是线程 A 在等待资源 2 的同时并不会释放在自己已经持有的资源 1

不可剥夺条件

不可剥夺条件是指,当线程已经持有了资源,在自己使用完之前不能被其他线程获取,线程 B 如果也想使用此资源,则只能在线程 A 使用完并释放后才能获取。

环路等待条件

环路等待条件是指,在死锁发生的时候,两个线程获取资源的顺序构成了环形链


模拟死锁问题的产生

用代码来模拟死锁问题的产生。

首先,我们创建 2 个线程,分别为线程A和线程B,然后有两个互斥锁,分别是 mutex_A 和 mutex_B,代码如下:

pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex_B = PTHREAD_MUTEX_INITIALIZER;int main()
{pthread_t tidA, tidB;//创建两个线程pthread_create(&tidA, NULL, threadA_proc, NULL);pthread_create(&tidB, NULL, threadB_proc, NULL);pthread_join(tidA, NULL);pthread_join(tidB, NULL);printf("exit\n");return 0;
}

线程A函数:

//线程函数 A
void *threadA_proc(void *data)
{printf("thread A waiting get ResourceA \n");pthread_mutex_lock(&mutex_A);printf("thread A got ResourceA \n");sleep(1);printf("thread A waiting get ResourceB \n");pthread_mutex_lock(&mutex_B);printf("thread A got ResourceB \n");pthread_mutex_unlock(&mutex_B);pthread_mutex_unlock(&mutex_A);return (void *)0;
}

可以看到,线程A函数的过程:

  • 先获取互斥锁 A ,然后睡眠 1 秒
  • 再获取互斥锁 B ,然后释放互斥锁 B
  • 最后释放互斥锁 A
//线程函数 B
void *threadB_proc(void *data)
{printf("thread B waiting get ResourceB \n");pthread_mutex_lock(&mutex_B);printf("thread B got ResourceB \n");sleep(1);printf("thread B waiting  get ResourceA \n");pthread_mutex_lock(&mutex_A);printf("thread B got ResourceA \n");pthread_mutex_unlock(&mutex_A);pthread_mutex_unlock(&mutex_B);return (void *)0;
}

可以看到,线程B函数的过程:

  • 先获取互斥锁 B ,然后睡眠 1 秒
  • 再获取互斥锁 A,然后释放互斥锁 A
  • 最后释放互斥锁 B

然后运行这个程序。结果如下:

thread B waiting get ResourceB 
thread B got ResourceB 
thread A waiting get ResourceA 
thread A got ResourceA 
thread B waiting get ResourceA 
thread A waiting get ResourceB 
// 阻塞中。

可以看到线程 B 在等待互斥锁 A 的释放,线程 A 在等待互斥锁 B 的释放,双方都在等待对方资源的释放 -> 产生了死锁。


避免死锁问题的发生

前面说到,产生死锁的四个必要条件是:互斥条件、持有并等待条件、不可剥夺条件、环路等待条件。

那么避免死锁问题就只需要破坏其中一个条件就可以,最常见的并且可行的就是使用资源有序分配法,来破坏环路等待条件

资源有序分配法:

线程 A 和线程 B 获取资源的顺序要一样,当线程 A 是先尝试获取资源 A ,然后尝试获取资源 B 的时候,线程 B 同样也是先尝试获取资源A ,然后尝试获取资源 B 。也就是说,线程 A 和 线程 B 总是以相同的顺序申请自己想要的资源

我们使用资源有序分配法的方式来修改前面发生死锁的代码,我们可以不改动线程 A 的代码。

我们先要清楚线程 A 获取资源的顺序,它是先获取互斥锁 A ,然后获取互斥锁 B。

所以我们只需要将线程B改成以相同顺序的获取资源,就可以打破死锁了。

 线程 B 函数改进后的代码如下:

//线程 B 函数,同线程 A 一样,先获取互斥锁 A,然后获取互斥锁 B
void *threadB_proc(void *data)
{printf("thread B waiting get ResourceA \n");pthread_mutex_lock(&mutex_A);printf("thread B got ResourceA \n");sleep(1);printf("thread B waiting  get ResourceB \n");pthread_mutex_lock(&mutex_B);printf("thread B got ResourceB \n");pthread_mutex_unlock(&mutex_B);pthread_mutex_unlock(&mutex_A);return (void *)0;
}

总结

简单来说,死锁问题的产生是由两个或者以上线程并行执行的时候,争夺资源而互相等待造成的。

死锁只有同时满足互斥、持有并等待、不可剥夺、环路等待这四个条件的时候才会发生。

所以要避免死锁问题,就是要破坏其中一个条件即可,最常用的方法就是使用资源有序分配法来破坏环路等待条件。

http://www.dinnco.com/news/10973.html

相关文章:

  • 网站前端程序制作开发模板建站哪个平台好
  • 晋城做网站公司aso排名服务公司
  • pc做网站服务器二级域名查询入口
  • 方城企业网站制作哪家好知乎营销推广
  • 日本漫画网站模板市场营销网站
  • 网站关停公告怎么做外链购买
  • 东营网格员招聘汕头seo排名收费
  • 建网站 陕西牛人网络科技微信朋友圈广告投放价格表
  • 网站建设做哪个科目外链大全
  • 中国工厂网官网汕头搜索引擎优化服务
  • 深圳网站建设电话咨询百度的相关搜索
  • 网站如何做支付宝接口怎么做网站模板
  • 免费网站java源码大全下载如何做网站优化
  • 阿里绿网网站违规网络营销产品概念
  • 属于seo网站优化品牌公关
  • 宝安网站改版宁波seo外包代运营
  • 深圳建设交易主页seo哪家公司好
  • 案例网站seo 优化思路
  • 如何在淘宝上做自己的网站网络营销比较好的企业
  • 阜阳做网站有吗社交网络推广方法有哪些
  • java项目视频网站开发惠州seo推广公司
  • 网站对公司的作用是什么意思2021最火营销方案
  • 大连网站开发 选领超科技软文写作的三个要素
  • 网店怎么做站内关键词排名优化软件
  • 吴江市中云建设监理有限公司网站品牌推广活动策划方案
  • 有域名自己怎么做网站营销推广怎么做
  • 河南股票配资网站建设百度seo优化教程
  • 中国宣布入境最新消息2023泉州seo按天计费
  • 济南资金盘网站开发公司靠谱吗超级seo外链
  • 珠海做网站优化网址域名ip查询