Mutex#
- class Mutex(*args, **kwargs)#
The Mutex
struct is an opaque data structure to represent a mutex
(mutual exclusion). It can be used to protect data against shared
access.
Take for example the following function:
int
give_me_next_number (void)
{
static int current_number = 0;
// now do a very complicated calculation to calculate the new
// number, this might for example be a random number generator
current_number = calc_next_number (current_number);
return current_number;
}
It is easy to see that this won’t work in a multi-threaded
application. There current_number must be protected against shared
access. A Mutex
can be used as a solution to this problem:
int
give_me_next_number (void)
{
static GMutex mutex;
static int current_number = 0;
int ret_val;
g_mutex_lock (&mutex);
ret_val = current_number = calc_next_number (current_number);
g_mutex_unlock (&mutex);
return ret_val;
}
Notice that the Mutex
is not initialised to any particular value.
Its placement in static storage ensures that it will be initialised
to all-zeros, which is appropriate.
If a Mutex
is placed in other contexts (eg: embedded in a struct)
then it must be explicitly initialised using init()
.
A Mutex
should only be accessed via g_mutex_
functions.
Methods#
- class Mutex
- clear() None #
Frees the resources allocated to a mutex with
init()
.This function should not be used with a
Mutex
that has been statically allocated.Calling
clear()
on a locked mutex leads to undefined behaviour.Added in version 2.32.
- init() None #
Initializes a
Mutex
so that it can be used.This function is useful to initialize a mutex that has been allocated on the stack, or as part of a larger structure. It is not necessary to initialize a mutex that has been statically allocated.
typedef struct { GMutex m; ... } Blob; Blob *b; b = g_new (Blob, 1); g_mutex_init (&b->m);
To undo the effect of
init()
when a mutex is no longer needed, useclear()
.Calling
init()
on an already initializedMutex
leads to undefined behaviour.Added in version 2.32.
- lock() None #
Locks
mutex
. Ifmutex
is already locked by another thread, the current thread will block untilmutex
is unlocked by the other thread.Mutex
is neither guaranteed to be recursive nor to be non-recursive. As such, callinglock()
on aMutex
that has already been locked by the same thread results in undefined behaviour (including but not limited to deadlocks).
- trylock() bool #
Tries to lock
mutex
. Ifmutex
is already locked by another thread, it immediately returnsFalse
. Otherwise it locksmutex
and returnsTrue
.Mutex
is neither guaranteed to be recursive nor to be non-recursive. As such, callinglock()
on aMutex
that has already been locked by the same thread results in undefined behaviour (including but not limited to deadlocks or arbitrary return values).