如果临界区域的修改操作只占一小部分, cas 可以获得更大的并发度,要怎么理解

2019-11-17 11:44:13 +08:00
 ruandao

谢谢

1.mutex 方式的临界区域是指 mutex.lockmutex.unlock 吗? 2.如果临界区域的修改操作只占一小部分,cas 可以获得更大的并发度 这句话要怎么理解?

969 次点击
所在节点    问与答
2 条回复
hhx
2019-11-17 12:32:23 +08:00
说下我的理解。mutex 即互斥信号量,它首先是个信号量,并且初始值为 1。信号量的 pv 操作可以理解成 Java 中的内置锁,即对象监视器 monitor。大家知道,获取锁失败后,进程将进入锁的阻塞队列,并进入阻塞态,等待被释放锁的进程唤醒。再看 cas,典型用法时 cas 失败时,不进入阻塞态,而是继续执行 cas,直到成功,这叫自旋。因此说 mutex 的加锁解锁,伴随着进程的阻塞与唤醒,而 cas 没有。要知道进程的阻塞与唤醒是代价较高的操作,伴随着 pcb 的检索,进程状态修改,pcb 入队出队,以及进程 cpu 上下文的切换。如果临界区的代码较少,显而易见,cas 自旋方式性能更高。
hhx
2019-11-17 12:42:20 +08:00
临界区完整的结构是,进入区,临界区,退出区和剩余取。进入区即 Lock.Lock,退出区即 Lock.unLock,剩余区即不需同步的代码段,临界区即需同步代码段。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/620351

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX