A concurrent FIFO queue is implemented as an "optimistic" doubly-linked
list. Nodes of the optimistic doubly-linked list are allocated
dynamically and links between the nodes are updated optimistically, i.e.,
assuming that threads concurrently accessing the FIFO queue will not
interfere with each other, using a simple store operation. Concurrent,
linearizable, and non-blocking enqueue and dequeue operations on the two
ends of the doubly-linked list proceed independently, i.e., disjointly.
These operations require only one successful single-word synchronization
operation on the tail pointer and the head pointer of the doubly-linked
list. If a bad ordering of operations on the optimistic FIFO queue by
concurrently executing threads creates inconsistencies in the links
between the nodes of the doubly-linked list, a fix-up process is invoked
to correct the inconsistencies.