atomic::value

This class stores a pointer to a single value, allocated via an allocator. When the object is reassigned, the previous object is stored in the operation stack via a call to log_delete(). When the object is rolled back, value::relink() deletes the current value and inserts the previous value back into the object. When the operation stack is cleaned up, the call to value::destroy() erases previous values.

There is a specialization for integers. In this case the integer is stored within the object itself, and the previous value is stored on the operation stack. relink() assigns the value back to the previous value stored as the pointer. destroy() does nothing.

atomic::list

This is implemented as a standard doubly-linked list with the following differences:

atomic::vector

Atomic vectors are store an array of values. The differences to std::vector are

atomic::map, atomic::set, atomic::multimap, atomic::multiset

These containers are all implemented around the same red-black tree implementation. The tree implementation has been modified by

Composite operations like operator=() can be implemented in terms of simpler insertions and deletions.

atomic::shared_ptr

See the TR1 documentation.

atomic::weak_ptr

See the TR1 documentation.

Thread safety

Transactions must be strictly nested to work on a single transaction stack. Therefore having transactions running in different threads will not work.

The simplest solution - which Atomic plans to implement - is for the transactions to lock the transaction stack for the duration of the transaction. So not only do transactions provide atomicity - they also provide thread safety ("isolation") as well! 

The other solution is to implement the transaction stack on thread-local storage.  While not as safe, it means that transactions can be run concurrently.