“并发对象历史:由操作调用、返回、参数、结果及线程内顺序组成,保留对象接口上可观察的行为;”
形式陈述
并发对象历史
调用与返回都出现时构成完整操作,只有调用而没有返回时称为 pending。若操作
该关系比较完整操作区间的端点,而不是比较调用先后:先调用但迟返回的操作仍可能与后调用操作重叠。区间重叠的操作在此关系下不可比。历史的 completion 可为部分 pending 调用补上匹配返回,再删除仍未完成的调用;采用哪种 completion 由具体正确性条件规定。
直觉
对象历史刻意只保留客户端可见接口,把锁、CAS 重试和缓存操作隐藏起来。两个实现内部走过完全不同的路径,只要产生同一调用—返回历史,对顺序规格而言便不可区分。操作区间重叠留下的“尚无实时先后”正是并发模型允许选择线性化顺序的空间。
最终对象状态不足以代替历史:相同终态可能伴随不同返回值或违反实时顺序。正确性因此是历史集合上的条件,而不只是终态不变量。
例子与边界
线程 enqueue(1),随后 dequeue(),Q 返回 1,P 尚未返回便崩溃。历史只有三个事件:P 的调用、Q 的调用、Q 的返回。若直接删除 P 的 pending 调用,就会得到“空队列弹出 1”的非法历史;适当 completion 为 P 补上成功返回,再把入队排在出队之前,才能解释已观察结果。补返回是规格中的存在性见证,不是声称崩溃进程真的收到过回复。
相反,若没有任何 enqueue(2) 调用而 Q 返回 2,completion 不能凭空创造一次新调用,因此无法修复该历史。这个区别把“请求可能已经生效”与“任何返回都可以事后圆回来”分开。
若 write(1) 已返回,另一线程才调用 read(),便有
参考资料
- Maurice P. Herlihy and Jeannette M. Wing, “Linearizability: A Correctness Condition for Concurrent Objects,” ACM TOPLAS 12(3), 1990.
- Maurice Herlihy and Nir Shavit, The Art of Multiprocessor Programming, rev. 1st ed., Morgan Kaufmann, 2012, Chapter 3.