共识的通用性
在多线程并发编程中,实现无等待同步是一个重要的目标。本文将介绍如何利用共识对象构建通用构造,以实现任何并发对象的无等待线性化实现。
1. 引言
在并发编程中,我们常常会遇到“无法用 Y 实现无等待的 X”这样的问题。每个对象都有一个关联的共识数,它是该对象能够解决共识问题的最大线程数。在一个有 n 个或更多并发线程的系统中,不可能用共识数低于 n 的对象来实现一个共识数为 n 的对象的无等待实现。不过,这并不意味着无等待同步是不可能或不可行的。
存在一些通用的对象类,只要有足够多的这些对象,就可以构建任何并发对象的无等待线性化实现。一个类在 n 个线程的系统中是通用的,当且仅当它的共识数大于或等于 n。例如,提供 compareAndSet() 操作的现代多处理器机器对于任意数量的线程都是通用的,它们可以以无等待的方式实现任何并发对象。
以下是不同共识数对应的对象类:
| 共识数 | 对象 |
| — | — |
| 1 | 原子寄存器 |
| 2 | getAndSet()、getAndAdd()、队列、栈 |
| … | … |
| m | (m, m(m + 1)/2)-寄存器赋值 |
| … | … |
| ∞ | 内存到内存移动、compareAndSet()、Load - Linked/StoreConditional |
理解通用构造及其含义可以帮助我们避免尝试解决无法解决的问题,也能让我们更好地进行工程优化,使这些构造更加高效。
2. 通用性
一个类 C 是通用的,如果可以用一定数量的 C
超级会员免费看
订阅专栏 解锁全文
2633

被折叠的 条评论
为什么被折叠?



