Next: The libitm ABI, Previous: Enabling libitm, Up: Top [Contents][Index]

## 2 C/C++ Language Constructs for TM

Transactions are supported in C++ and C in the form of transaction statements, transaction expressions, and function transactions. In the following example, both `a` and `b` will be read and the difference will be written to `c`, all atomically and isolated from other transactions:

    __transaction_atomic { c = a - b; }

Therefore, another thread can use the following code to concurrently update `b` without ever causing `c` to hold a negative value (and without having to use other synchronization constructs such as locks or C++11 atomics):

    __transaction_atomic { if (a > b) b++; }

GCC follows the Draft Specification of Transactional Language Constructs for C++ (v1.1) in its implementation of transactions.

The precise semantics of transactions are defined in terms of the C++11/C11 memory model (see the specification). Roughly, transactions provide synchronization guarantees that are similar to what would be guaranteed when using a single global lock as a guard for all transactions. Note that like other synchronization constructs in C/C++, transactions rely on a data-race-free program (e.g., a nontransactional write that is concurrent with a transactional read to the same memory location is a data race).