多线程互斥之Dekker算法
来源:互联网 发布:kali linux 字典 编辑:程序博客网 时间:2024/05/21 07:11
前言
当并发线程竞争使用同一个资源时,它们互相之间会发生冲突,我们可以把这种情况简单描述如下:两个或更多的线程在它们的运行过程中需要访问一个资源,每个进程并不知道其他线程的存在,并且每一个线程也不受其他线程的影响。每个线程都不影响它所使用的资源的状态,这类资源包括I/O设备、存储器、处理器时间和时钟。
竞争线程间没有任何信息交换,但是一个线程的执行可能会影响到竞争线程的行为。特别是如果两个线程都期望访问同一个资源,操作系统把这个资源分配给一个线程,另一个就必须等待。因此,被拒绝访问的线程速度就会变慢。一种极端情况是,被阻塞的线程永远不能访问这个资源,因此一直不能成功地终止。
临界区与临界资源
竞争线程面临的首先是互斥的要求。假设两个或者更多的线程需要访问一个不可共享的资源,如打印机。在执行过程中,每个线程都给该I/O设备发命令,接收状态信息,发送数据和接收数据。我们把这类资源称为临界资源,使用临界资源的那一部分代码称为程序的临界区。一次只允许有一个程序在临界区中,这一点是非常重要的。
由于不清楚详细要求,我们不能仅仅通过操作系统来理解和增强这个限制。这就需要我们程序员具备较强的处理并发的能力。
例如在打印机的例子中,我们希望任何一个线程在打印整个文件时都拥有打印机的控制权,否则在打印结果中就会穿插着来自竞争资源的打印内容。
实施互斥产生了两个额外的控制问题。一个是死锁。一个是饥饿。要解决好这两个问题,就需要一个好的互斥算法,既要使得多线程程序高效运行,又要防止死锁的发生。
假设有
- 在某些资源
Ra 上操作的临界区。 - 不涉及访问资源
Ra 的额外代码。
因为所有的线程都需要访问同一资源
/*PROCESS*/void p(Ra){ while(true) { /*preceding code*/ entercritical(Ra); /*critical section*/ exicritical(Ra); /*following code*/ }}
Dekker算法
enum BLOCKMODEL{ PRODUCER,CONSUMER};bool queue_mutex[2];int queue_turn;void Dekker_in(bool mutex[2],int &turn,BLOCKMODEL type){ BLOCKMODEL another_type=(BLOCKMODEL)abs(type-1); mutex[type]=true; while(mutex[another_type]) { if(turn==another_type) { mutex[type]=false; while(turn==another_type) { Sleep(1); } mutex[type]=true; } Sleep(1); }}void Dekker_out(bool mutex[2],int &turn,BLOCKMODEL type){ BLOCKMODEL another_type=(BLOCKMODEL)abs(type-1); turn=another_type; mutex[type]=false;}//生产者调用实例(消费者只需要把PRODUCER换成CONSUMER)Dekker_in(queue_mutex,queue_turn,PRODUCER);/*临界区操作*/Dekker_out(queue_mutex,queue_turn,PRODUCER);
当然,对于互斥算法,各类编程平台都做了封装的工作,可以直接拿来用,但是要追求高效率、高鲁棒性的程序,像这样的实现代码还是很有价值的。但是一般来说
参考文献
[1] 操作系统——精髓与设计原理 【美】William Stallings 编著 陈渝 译
转载请注明出处:http://blog.csdn.net/fourierFeng/article/details/78132341
- 多线程互斥之Dekker算法
- 进程互斥(二)Dekker算法
- 互斥的软件实现:Peterson算法和Dekker算法
- 操作系统原理——Dekker互斥算法详解
- 操作系统原理——Dekker互斥算法详解
- 解决临界区(互斥)的软件方法-Dekker算法和Peterson算法
- Dekker 算法
- Dekker算法
- C#多线程之互斥
- Java多线程之互斥
- Dekker算法详解:
- 多线程之使用互斥信号量Sample~
- 多线程同步之互斥对象
- 多线程之三:互斥对象
- 【多线程】线程互斥之synchronized 详解
- 多线程同步之互斥对象
- 多线程之互斥、同步方法解析
- 多线程编程(10) - 多线程同步之 Mutex (互斥对象)
- I2C配置及调试流程
- laravel blade模板
- HDU
- 关于Oracle将小于1的数字to_char后丢掉小数点前0的解决办法
- 十大PHP安全要点
- 多线程互斥之Dekker算法
- 前台实现分页效果
- [二分+二分图匹配]BZOJ 4443: [Scoi2015]小凸玩矩阵 题解
- 常见的数字验证正则表达式整理
- netty 服务端和客户端创建流程
- tomcat日志清理全攻略
- VMWare10+CentOS 6.4下载与安装详解
- 安装与配置Maven(Windows7上)
- 免费而优秀的图表JS插件、js图表、html图表--百度的Echart、Highcharts、阿里的G2、Chart.js