glib.rwlock

Module for RWLock class

class RWLock

Types 1

classRWLock

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.

Fields
GRWLock _cInstance
Methods
void * _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 locked
void 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.
Constructors
this(void * ptr, Flag!"Take" take)