• 《多处理器编程的艺术》读书笔记(3) 双线程解决方案


          我们先从两个虽然存在不足但却十分有趣的锁算法讲起。
          LockOne类
          双线程的锁算法遵循以下两点约定:线程的标识为0或1,若当前调用者的标识为i,则另一方为j = 1 - i;每个线程通过调用ThreadID.get()获取自己的标识。
    用writeA(x = v)表示A将值v赋予域x,用readA(v == x)表示A从域x中读取值v。在值不重要的情形下,可以省略v。下图的writeA(flag[i] = true)事件是由lock()方法中第9行代码的执行所引起的。
    Code

          LockOne算法虽然满足互斥特性,但存在着缺陷,其原因在于线程交叉执行时会出现死锁。若事件writeA(flag[A] = true)及writeB(flag[B] = true)在事件readA(flag[B])和readB(flag[A])之前发生,那么两个线程都将陷入无穷等待。然而,LockOne算法有一个有趣的特点:如果一个线程在另一个线程之前运行,则不会发生死锁,一切都工作得很好。

    LockTwo类
    Code

          LockTwo类也存在缺陷,当一个线程完全先于另一个线程就会出现死锁。但是如果线程并发地执行时,setlock()方法则是成功的。LockOne类和LockTwo类彼此互补:能够保证一种解法正常工作的条件将会使另一种解法发生死锁。

    Peterson锁
          该算法将LockOne和LockTwo结合起来,无疑是最简洁、最完美的双线程互斥算法,按照其发明者的名字被命名为“Peterson算法”。
    Code
  • 相关阅读:
    FusionCharts数据展示成饼状图、柱状图和折线图
    Js获取request中的对象的属相值
    在grid结果集中实现全选或全不选某些特定的行
    JQuery的一些基础知识
    查询的数据插入不到临时表中的原因
    Javascript获取页面表格中的数据
    ajax实现菜单联动显示信息(当选择单位的时候,动态关联出人员信息)
    form表单只提交数据而不进行页面跳转的解决方案
    NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”
    LINQ to SQL语句
  • 原文地址:https://www.cnblogs.com/pennant/p/1577025.html
Copyright © 2020-2023  润新知