博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第七十六课、多线程间的互斥(下)------------------狄泰软件学院
阅读量:6291 次
发布时间:2019-06-22

本文共 2927 字,大约阅读时间需要 9 分钟。

一、多线程间的互斥

1、程序的临界资源与线程锁的数量关系

(1)、一般性原则:每一个临界资源都需要一个线程锁进行保护

 2、死锁的概念

(1)、线程间相互等待资源而造成彼此无法继承执行

3、发生死锁的条件

(1)、系统中存在多个临界资源且临界资源不可抢占(每次只有一个线程使用)

(2)、线程需要多个临界资源才能继续执行

#include 
#include
#include
#include
static QMutex g_mutex_1;static QMutex g_mutex_2;class ThreadA : public QThread{protected: void run() { while(true) { g_mutex_1.lock();//获取第一把锁后就会去等待第二把锁,但第二把锁可能已经被另一个线程获取,会一直死等 g_mutex_2.lock(); qDebug() << objectName() << " doing work"; g_mutex_2.unlock(); g_mutex_1.unlock(); } }};class ThreadB : public QThread{protected: void run() { while(true) { g_mutex_2.lock(); g_mutex_1.lock(); qDebug() << objectName() << " doing work"; g_mutex_1.unlock(); g_mutex_2.unlock(); } }};int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); ThreadA ta; ThreadB tb; ta.setObjectName("ta"); tb.setObjectName("tb"); ta.start(); tb.start(); return a.exec();}
死锁的产生

4、死锁的避免

(1)、对所有的临界资源都分配唯一一个序号(r1,r2,r3,...,rn)

(2)、对应的线程锁也分配同样的序号(m1,m2,m3,..., mn)

(3)、系统中的每个线程按照严格递增的次序请求资源

#include 
#include
#include
#include
static QMutex g_mutex_1;static QMutex g_mutex_2;class ThreadA : public QThread{protected: void run() { while(true) { g_mutex_1.lock(); g_mutex_2.lock(); qDebug() << objectName() << " doing work"; g_mutex_2.unlock(); g_mutex_1.unlock(); } }};class ThreadB : public QThread{protected: void run() { while(true) { g_mutex_1.lock();//都是递增获取资源 g_mutex_2.lock(); qDebug() << objectName() << " doing work"; g_mutex_2.unlock(); g_mutex_1.unlock(); } }};int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); ThreadA ta; ThreadB tb; ta.setObjectName("ta"); tb.setObjectName("tb"); ta.start(); tb.start(); return a.exec();}
改进:都是递增获取临界资源

5、信号量的概念

(1)、信号量是特殊的线程锁

(2)、信号量允许多个线程同时访问临界资源

(3)、Qt中直接支持信号量(QSemaphore)

 

#include 
#include
#include
#include
const int SIZE = 5;unsigned char g_buff[SIZE] = {
0};QSemaphore g_sem_free(SIZE);QSemaphore g_sem_used(0);class Producer : public QThread{protected: void run() { while(true) { int value = qrand() % 256; g_sem_free.acquire();//生产了一个产品,需要生产的数量减1 for(int i=0; i
使用信号量解决多个生产消费者的问题

二、小结

(1)、多线程间相互等待资源导致死锁

(2)、可以对临界资源进行编号的方法避免死锁

(3)、所有线程必须按照严格递增的次序请求资源

(4)、Qt中直接支持信号量(QSemaphore)

(5)、信号量允许多个线程同时访问临界资源

 

转载于:https://www.cnblogs.com/gui-lin/p/6444087.html

你可能感兴趣的文章
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
javascript 中出现missing ) after argument list的错误
查看>>
使用Swagger2构建强大的RESTful API文档(2)(二十三)
查看>>
Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
查看>>
(转)第三方支付参与者
查看>>