Is Compare-and-Swap Really Necessary?
The consensus number of a synchronization primitive, such as compare-and-swap or fetch-and-add, is the maximum number of processes n among which binary consensus can be solved by using read-write registers and registers supporting the synchronization primitive. As per Herlihy's seminal result, any synchronization primitive with consensus number n can be used to construct a wait-free and linearizable implementation of any non-trivial concurrent object or a data structure that is shared among n processes. As the compare-and-swap primitive has infinite consensus number and is widely supported by multi-processors, synchronization tasks have been typically solved using the compare-and-swap synchronization primitive. In this paper, we show that having compare-and-swap as the quintessential synchronization primitive for solving wait-free synchronization is not necessary. It is not necessary as we give an O(1) time wait-free and linearizable implementation of a compare-and-swap register for processes 1,2,...,n using registers that support the two weak synchronization primitives half-max and max-write, each with consensus number one. Thus, any algorithm that uses powerful compare-and-swap registers to solve some arbitrary synchronization problem among processes 1,2,..., n can be transformed into an algorithm that has the same asymptotic time complexity and only uses weak consensus number one primitives.
READ FULL TEXT