对互斥的正确软件实现算法(面包店算法)是非常耗时的,现代的计算机系统都会提供简单的硬件指令,使用这些指令能够有效地解决临界区问题。

硬件提供一个TestAndSet指令,来实现原子指令的功能:

 bool TestAndSet(bool *target)
{
bool rv = *target;
*target = true;
return rv;
}

在执行上述TestAndSet()函数时是不可以被打断的,因此可以使用以下方法来实现进程的同步:

 do
{
//剩余区 waiting[i] = true;//表示进程Pi处于等待获取锁的状态
key = true;
while(waiting[i]&&key)
key=TestAndSet(lock);//如果进程Pi抢到了锁,记录key=false
waiting[i]=false; //临界区 j=(i+)%n;
while(j!=i && !waiting[j])//进程Pj处于等待获取锁的状态
j = (j+)%n;
if(j==i)
lock = false;
else
waiting[j] = false; //剩余区
}
while(true);

临界区条件1:互斥
第一个进入的进程Pi要等执行了TestAndSet之后才能进入,这时Pi的key=false,其他进程key=true;后续进入的进程Pi,只有在其他进程将waiting[i]设为false之后,才可能进入。
临界区条件2:空闲让进
初始,key和所有的waiting[i]都为True,lock=false,因此首次执行TestAndSet的进程会进入临界区。当进入临界区的进程Pi执行完临界区操作之后,在退出区,通过While循环扫描当前处于等待状态的进程j (j!=i),如果找到j,那么waiting[j]被设为false,Pj会随后进入临界区如果没有找到j,那么lock被置为false。总之,只要临界区资源空闲,想进入临界区的进程(其waiting[j]=true)都会被放进临界区。
临界区条件3:有限等待
每个进程退出临界区的时候,总会按顺序执行一个扫描,这个循环扫描的过程保证一个进程最多等待n-1次即可进入临界区操作。

最新文章

  1. .NET环境下基于RBAC的访问控制
  2. *HDU3038 并查集
  3. 通过统计用户DNS解析记录,实现监控用户上网行为
  4. mysql-窗口多表连接视图view
  5. freeCodeCamp:Return Largest Numbers in Arrays
  6. 利用 FFmpeg palettegen paletteuse 生成接近全色的 gif 动画
  7. 编译gcc4.7.3 其他版本的应该也可以
  8. SQL查詢數據字典
  9. 8.python中的数字
  10. mysql 5.7 root password 过期
  11. HDU 1176 免费馅饼(DP)
  12. [ZETCODE]wxWidgets教程四:菜单栏和工具栏
  13. 如何改变xls中的单元格左上角的图标
  14. web项目启动流程探索
  15. UTL_HTTP Call a Web Service and Pass Parameters as Part of the URL
  16. MongoDB数据模型设计
  17. 让自己的网站实现在线编辑office文档
  18. TensorFlow从入门到理解(一):搭建开发环境【基于Ubuntu18.04】
  19. Spark2.3(三十六):根据appName验证某个app是否在运行
  20. C++ 解析json串

热门文章

  1. PAT (Basic Level) Practice 1008 数组元素循环右移问题
  2. NUCLEO-L053R8 TIM定时器 PWM输出
  3. linux之sed基础命令详解
  4. 如何配置 SpaceVim
  5. git配置config记住密码
  6. cyclone4驱动LM75A温湿度传感器学习
  7. SpringBoot入门(二)——起步依赖
  8. 「题目代码」P1054~P1059(Java)
  9. 「日常训练」 Counting Cliques(HDU-5952)
  10. 汽车VIN码识别/汽车车架号OCR识别,移动端VIN码识别,OCR扫描工具