  A common problem when implementing concurrent programs is efficiently
protecting against unsafe races between processes reading and then using a
resource (e.g., memory blocks, file descriptors, or network connections) and
other processes that are concurrently overwriting and then destructing the same
resource. Such read-destruct races can be protected with locks, or with
lock-free solutions such as hazard-pointers or read-copy-update (RCU).
  In this paper we describe a method for protecting read-destruct races with
expected constant time overhead, $O(P^2)$ space and $O(P^2)$ delayed destructs,
and with just single word atomic memory operations (reads, writes, and CAS). It
is based on an interface with four primitives, an acquire-release pair to
protect accesses, and a retire-eject pair to delay the destruct until it is
safe. We refer to this as the acquire-retire interface. Using the
acquire-retire interface, we develop simple implementations for three common
use cases: (1) memory reclamation with applications to stacks and queues, (2)
reference counted objects, and (3) objects manage by ownership with moves,
copies, and destructs. The first two results significantly improve on previous
results, and the third application is original. Importantly, all operations
have expected constant time overhead.
