• 《多处理器编程的艺术》读书笔记(7) CLH队列锁


          ALock并发线程的最大个数为一个已知的界限N,同时也要为每个锁分配一个与该界限大小相同的数组。 就算一个线程每次只访问一个锁,同步L个不同对象也需要O(LN)大小的空间。

    CLHLock

    Code

           类QNode的布尔型Locked属性记录了每个线程的状态。如果Locked为true,则对应的线程要么已经获得到锁,要么正在等待锁;如果Locked为false,则对应的线程已经释放了锁。线程被顺序地排入“隐式”链表,每个线程通过一个线程局部变量myPred指向前驱线程,公共的tail保存着最近加入到队列的结点。

          若要获得锁,线程将自己的myNode的Locked设为true,表示该线程准备获得锁。随后线程对tail调用Interlocked.Exchange方法,把自身的前驱myPred指向队尾,并将自身设置为新队尾。最后线程就在myPred的Locked上旋转,直到myPred释放锁。若要释放锁,线程将其Locked设为false。

          CLHLock让每个线程在不同的存储单元上旋转,这样当一个线程释放它的锁时,只能使其后继的cache无效。该算法比ALock所需要的空间少(同步L个不同对象只需要O(L + N)的空间),且不需要知道可能使用锁的线程数量。也提供了先来先服务的公平性。
  • 相关阅读:
    关于OCI接口理解
    linux 关闭selinux
    Web 浏览器之事件循环 Event Loop
    Web 浏览器之页面展示原理
    Web 前端工程化(Node、Babel、webpack、Vue、Nginx)
    Web 包管理工具(npm、yarn、cnpm、pnpm)
    kmeans算法
    Django_re_path_使用正则匹配url
    VMware_关机未关闭vm导致显示红叉的处理方法
    Django_发送邮件
  • 原文地址:https://www.cnblogs.com/pennant/p/1588904.html
Copyright © 2020-2023  润新知