Basics
Guides
API Reference
Basics
Guides
API Reference
[46:7] extends: object
The [struct@StaticRWLock] struct represents a read-write lock. A read-write
lock can be used for protecting data that some portions of code only read
from, while others also write. In such situations it is desirable that
several readers can read at once, whereas of course only one writer may write
at a time. Take a look at the following example: |[ GStaticRWLock rwlock =
G_STATIC_RW_LOCK_INIT; GPtrArray *array; gpointer my_array_get (guint index)
{ gpointer retval = NULL; if (!array) return NULL;
g_static_rw_lock_reader_lock (&rwlock); if (index < array->len) retval =
g_ptr_array_index (array, index); g_static_rw_lock_reader_unlock (&rwlock);
return retval; } void my_array_set (guint index, gpointer data) {
g_static_rw_lock_writer_lock (&rwlock); 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_static_rw_lock_writer_unlock
(&rwlock); } ]| 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 once 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. Most of the time, writers should have precedence over readers. That
means, for this implementation, that as soon as a writer wants to lock the
data, no other reader is allowed to lock the data, whereas, of course, the
readers that already have locked the data are allowed to finish their
operation. As soon as the last reader unlocks the data, the writer will lock
it. Even though [struct@StaticRWLock] is not opaque, it should only be used
with the following functions. All of the g_static_rw_lock_* functions can
be used even if [func@Thread.init] has not been called. Then they do nothing,
apart from g_static_rw_lock_*_trylock, which does nothing but returning
true. A read-write lock has a higher overhead than a mutex. For example, both
[method@StaticRWLock.reader_lock] and [method@StaticRWLock.reader_unlock]
have to lock and unlock a [struct@StaticMutex], so it takes at least twice
the time to lock and unlock a [struct@StaticRWLock] that it does to lock and
unlock a [struct@StaticMutex]. So only data structures that are accessed by
multiple readers, and which keep the lock for a considerable time justify a
[struct@StaticRWLock]. The above example most probably would fare better with
a [struct@StaticMutex].
GStaticRWLock (Handle = null)
Creates a new
StaticRWLockby wrapping a native handle or another wrapper.
Handle is the native handle or another wrapper whose handle to adopt.toNativeHandle (Source)
Normalizes a constructor argument into a raw pointer carrier. Accepts a raw NativeHandle, a raw NativeBuffer returned from
fn.call(...), another generated wrapper exposinghandle(), or null. Returns null when the argument carries no pointer.
Source is the raw handle, raw buffer, wrapper, or null.A raw pointer carrier or null when no pointer is present.getLib ()
Returns the opened native library for this generated wrapper.
The opened native library.handle ()
Returns the wrapped NativeHandle.
The wrapped NativeHandle.isNull ()
Returns true when the wrapped handle is null.
A bool.describe ()
Returns a small string for debugging generated wrappers.
A string.free ()
Releases all resources allocated to @lock. You don't have to call this functions for a #GStaticRWLock with an unbounded lifetime, i.e. objects declared 'static', but if you have a #GStaticRWLock as a member of a structure, and the structure is freed, you should also free the #GStaticRWLock.
None.init ()
A #GStaticRWLock must be initialized with this function before it can be used. Alternatively you can initialize it with %G_STATIC_RW_LOCK_INIT.
None.reader_lock ()
Locks @lock for reading. There may be unlimited concurrent locks for reading of a #GStaticRWLock at the same time. If @lock is already locked for writing by another thread or if another thread is already waiting to lock @lock for writing, this function will block until @lock is unlocked by the other writing thread and no other writing threads want to lock
This lock has to be unlocked by g_static_rw_lock_reader_unlock(). #GStaticRWLock is not recursive. It might seem to be possible to recursively lock for reading, but that can result in a deadlock, due to writer preference.None.reader_trylock ()
Tries to lock @lock for reading. If @lock is already locked for writing by another thread or if another thread is already waiting to lock @lock for writing, immediately returns %FALSE. Otherwise locks @lock for reading and returns %TRUE. This lock has to be unlocked by g_static_rw_lock_reader_unlock().
%TRUE, if @lock could be locked for reading.reader_unlock ()
Unlocks @lock. If a thread waits to lock @lock for writing and all locks for reading have been unlocked, the waiting thread is woken up and can lock @lock for writing.
None.writer_lock ()
Locks @lock for writing. If @lock is already locked for writing or reading by other threads, this function will block until @lock is completely unlocked and then lock @lock for writing. While this functions waits to lock @lock, no other thread can lock @lock for reading. When
is locked for writing, no other thread can lock @lock (neither for reading nor writing). This lock has to be unlocked by g_static_rw_lock_writer_unlock().None.writer_trylock ()
Tries to lock @lock for writing. If @lock is already locked (for either reading or writing) by another thread, it immediately returns %FALSE. Otherwise it locks @lock for writing and returns %TRUE. This lock has to be unlocked by g_static_rw_lock_writer_unlock().
%TRUE, if @lock could be locked for writing.writer_unlock ()
Unlocks @lock. If a thread is waiting to lock @lock for writing and all locks for reading have been unlocked, the waiting thread is woken up and can lock @lock for writing. If no thread is waiting to lock @lock for writing, and some thread or threads are waiting to lock @lock for reading, the waiting threads are woken up and can lock @lock for reading.
None.
Aussom
Write once. Embed everywhere.
Copyright 2026 Austin Lehman. All rights reserved.