glib.rwlock
Module for RWLock class
Types 1
The GRWLock struct is an opaque data structure to represent a reader-writer lock. It is similar to a #GMutex in that it allows multiple threads to coordinate access to a shared resource.
The difference to a mutex is that a reader-writer lock discriminates between read-only ('reader') and full ('writer') access. While only one thread at a time is allowed write access (by holding the 'writer' lock via glib.rwlock.RWLock.writerLock), multiple threads can gain simultaneous read-only access (by holding the 'reader' lock via glib.rwlock.RWLock.readerLock).
It is unspecified whether readers or writers have priority in acquiring the lock when a reader already holds the lock and a writer is queued to acquire it.
Here is an example for an array with access functions:
GRWLock lock;
GPtrArray *array;
gpointer
my_array_get (guint index)
{
gpointer retval = NULL;
if (!array)
return NULL;
g_rw_lock_reader_lock (&lock);
if (index < array->len)
retval = g_ptr_array_index (array, index);
g_rw_lock_reader_unlock (&lock);
return retval;
}
void
my_array_set (guint index, gpointer data)
{
g_rw_lock_writer_lock (&lock);
if (!array)
array = g_ptr_array_new ();
if (index >= array->len)
g_ptr_array_set_size (array, index+1);
g_ptr_array_index (array, index) = data;
g_rw_lock_writer_unlock (&lock);
} This example shows an array which can be accessed by many readers (the my_array_get() function) simultaneously, whereas the writers (the my_array_set() function) will only be allowed one at a time and only if no readers currently access the array. This is because of the potentially dangerous resizing of the array. Using these functions is fully multi-thread safe now.If a #GRWLock is allocated in static storage then it can be used without initialisation. Otherwise, you should call glib.rwlock.RWLock.init_ on it and glib.rwlock.RWLock.clear when done.
A GRWLock should only be accessed with the g_rw_lock_ functions.
GRWLock _cInstancevoid * _cPtr()void clear()Frees the resources allocated to a lock with [glib.rwlock.RWLock.init_].void init_()Initializes a #GRWLock so that it can be used.void readerLock()Obtain a read lock on rw_lock. If another thread currently holds the write lock on rw_lock, the current thread will block until the write lock was (held and) released. If another thread does not ho...bool readerTrylock()Tries to obtain a read lock on rw_lock and returns true if the read lock was successfully obtained. Otherwise it returns false. Returns: true if rw_lock could be lockedvoid readerUnlock()Release a read lock on rw_lock.void writerLock()Obtain a write lock on rw_lock. If another thread currently holds a read or write lock on rw_lock, the current thread will block until all other threads have dropped their locks on rw_lock.bool writerTrylock()Tries to obtain a write lock on rw_lock. If another thread currently holds a read or write lock on rw_lock, it immediately returns false. Otherwise it locks rw_lock and returns true. Returns: true ...void writerUnlock()Release a write lock on rw_lock.