Skip to content

并发对象

Concurrent object

可被多个线程并发调用并以顺序规格解释操作效果的共享对象。

条目类型
模型

形式陈述

并发对象是共享内存系统中一个实现了顺序抽象数据类型的共享实体:多个线程可以调用其操作,且不同线程的操作区间(从调用事件到返回事件)允许在时间上重叠。对象的行为由并发对象历史记录——调用与返回事件的序列,每个线程内部保持程序顺序。正确性条件规定哪些并发历史是可接受的,做法是将其与顺序规格关联:例如线性一致性要求每个已完成操作都能指定一个落在其调用与返回之间的线性化点,使按这些点排序的顺序执行符合顺序规格;顺序一致性只要求存在保持各线程程序顺序的合法顺序重排。

除安全性外,对象规格还须声明进展条件。阻塞、obstruction-freelock-freewait-free分别量化不同的执行和完成对象;它们不改变对象的顺序规范,安全与进展是相互独立的两个维度。

直觉

并发对象的价值在于封装:使用者眼中它就是一个栈、队列或寄存器,可以拿顺序世界的直觉去推理"弹出的元素必是之前压入的";而实现内部却是缓存行、原子指令与重试环的交错乱流。正确性条件正是连接这两个世界的合同——它断言无论实际交错多么复杂,外部可观察的行为都等价于某个合法的顺序执行。这样客户端代码的正确性证明只需依赖顺序规格,完全不必知道实现细节,多线程软件的模块化才成为可能。需要打破的第一印象是"线程安全"是个单一概念:它至少分解为"哪种一致性条件"与"哪种进展保证"两个正交的问题,用锁包住每个方法与精心设计的 wait-free 算法可能满足同一个安全条件,进展性质却天差地别。

例子与边界

正例:一个线性一致的并发队列上,线程 P 调用 enqueue(1)、线程 Q 几乎同时调用 enqueue(2),两个区间重叠。此时"1 在前"与"2 在前"都合法——线性化点可以在重叠区间内任意安放;但一旦后续 dequeue 返回了 2,就等于宣告线性化顺序是 2 在前,之后的第二次 dequeue 必须返回 1。可见并发历史并不唯一确定顺序,但已经观察到的结果会约束尚未发生的行为。

边界之一:用一把互斥锁保护整个对象可以轻松获得线性一致性(线性化点取临界区内任一时刻),但它是阻塞的——持锁线程被操作系统换出时,所有其他线程都被动等待,这展示了"安全性达标、进展性垫底"的组合。边界之二是组合性:线性一致性是局部的——每个对象各自线性一致则整个系统线性一致;顺序一致性没有这条性质,两个各自顺序一致的对象组合后可能产生无法用任何单一顺序解释的历史。因此在多对象系统里选用哪种正确性条件,直接决定能否逐对象地做证明。

并发栈的两个重叠 push 可按任一顺序线性化,但随后 pop 必须与所选顺序一致。若一个 pop 在某个 push 调用前已经返回,就不能把它排在该 push 之后。线程安全只说没有数据竞态通常不够,还需判断行为是否满足栈、队列等抽象规格。

推论与应用

并发对象是多核数据结构设计的基本单元:并发哈希表、无锁队列、读写锁与事务内存都以“顺序规格 + 一致性条件 + 进展条件”的三元组陈述目标。非阻塞层级说明一次调用在何种调度下完成;端到端证明还要把内存分配、回收和回调的进展性质算入。

理论上,对象类型是共享内存可计算性研究的载体。Herlihy 共识层级按“能为多少线程 Wait-free 地解决共识”分类对象,并说明低层对象不能 Wait-free 实现高层对象;这是一项对象类型的表达力结论,不是具体实现的性能排名。

参考资料
  • Maurice Herlihy and Nir Shavit, The Art of Multiprocessor Programming, rev. 1st ed., Morgan Kaufmann, 2012,Chs. 1–18。
  • Hagit Attiya and Jennifer Welch, Distributed Computing: Fundamentals, Simulations, and Advanced Topics, 2nd ed., Wiley, 2004,Chs. 1–18。
关系图谱14 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例