In MySQL and InnoDB
, multiple threads of
execution access shared data structures. InnoDB
synchronizes these accesses with its own implementation of
mutexes and
read/write locks.
Historically, InnoDB
protected the internal
state of a read/write lock with an InnoDB
mutex, and the internal state of an InnoDB
mutex was protected by a
Pthreads mutex, as in
IEEE Std 1003.1c (POSIX.1c).
On many platforms, Atomic operations can often be used to synchronize the actions of multiple threads more efficiently than Pthreads. Each operation to acquire or release a lock can be done in fewer CPU instructions, wasting less time when threads contend for access to shared data structures. This in turn means greater scalability on multi-core platforms.
On platforms that support
Atomic operations,
InnoDB
now implements mutexes and read/write
locks with the
built-in
functions provided by the GNU Compiler Collection (GCC) for atomic
memory access instead of using the Pthreads approach. More
specifically, InnoDB
compiled with GCC version
4.1.2 or later uses the atomic builtins instead of a
pthread_mutex_t
to implement
InnoDB
mutexes and read/write locks.
On 32-bit Microsoft Windows, InnoDB
implements
mutexes (but not read/write locks) with hand-written assembler
instructions. Beginning with Microsoft Windows 2000, functions for
Interlocked
Variable Access are available that are similar to the
built-in functions provided by GCC. On Windows 2000 and higher,
InnoDB
makes use of the Interlocked functions,
which support read/write locks and 64-bit platforms.
Solaris 10 introduced library functions for atomic operations, and
InnoDB uses these functions by default. When MySQL is compiled on
Solaris 10 or later with a compiler that does not support the
built-in
functions provided by the GNU Compiler Collection (GCC) for atomic
memory access, InnoDB
uses the library
functions.
On platforms where the GCC, Windows, or Solaris functions for
atomic memory access are not available, InnoDB
uses the traditional Pthreads method of implementing mutexes and
read/write locks.
When MySQL starts, InnoDB
writes a message to
the log file indicating whether atomic memory access is used for
mutexes, for mutexes and read/write locks, or neither. If suitable
tools are used to build InnoDB
and the target
CPU supports the atomic operations required,
InnoDB
uses the built-in functions for
mutexing. If, in addition, the compare-and-swap operation can be
used on thread identifiers (pthread_t
), then
InnoDB
uses the instructions for read-write
locks as well.
If you are building from source, ensure that the build process properly takes advantage of your platform capabilities.