结构体

GLibRWLock

自版本: 2.32 起

说明 [src]

struct GRWLock {
  /* No available fields */
}

GRWLock 结构体是一个不透明数据结构,用于表示读写锁。它类似于 GMutex,因为它允许多个线程协调对共享资源的访问。

与互斥锁的差别在于,读写锁区分了只读(“读”)和完全(“写”)的访问。一次只允许一个线程访问(通过 g_rw_lock_writer_lock() 保持“写”锁),而多个线程可以同时获得只读访问(通过 g_rw_lock_reader_lock() 保持“读”锁)。

当一个读进程已获取锁而一个写进程排队等待获取锁时,由读者还是由写者优先获取锁还尚未明确。

以下是有关使用访问函数的数组示例

  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);
  }

此示例展示了一个可供许多读进程(通过 my_array_get() 函数)同时访问的数组,而写进程(通过 my_array_set() 函数)则一次只能允许一个访问,且也只允许在没有读进程访问数组时进行访问。原因在于数组可能会进行危险的调整大小。使用这些函数现在是完全多线程安全的。

如果 GRWLock 分配给一个静态存储,那么它可用来做初始化。否则,应使用 g_rw_lock_init(),完成后再使用 g_rw_lock_clear()。

GRWLock 应当只使用 g_rw_lock_ 函数访问。

可用于版本: 2.32 起

实例方法

g_rw_lock_clear

释放使用 g_rw_lock_init() 分配给锁的资源。

自版本: 2.32 起

g_rw_lock_init

初始化 GRWLock 以便可以使用它。

自版本: 2.32 起

g_rw_lock_reader_lock

获取 rw_lock 上的读锁。如果另一个线程当前在 rw_lock 上持有写锁,当前线程将一直阻塞,直至写锁被持有并释放。如果另一个线程未持有写锁,但正在等待写锁,由读进程还是由写进程阻塞将由实现决定。读锁可以递归获取。

自版本: 2.32 起

g_rw_lock_reader_trylock

尝试获取 rw_lock 上的读锁,如果获取成功,则返回 TRUE。否则返回 FALSE。

自版本: 2.32 起

g_rw_lock_reader_unlock

释放 rw_lock 上的读锁。

自版本: 2.32 起

g_rw_lock_writer_lock

获取 rw_lock 上的写锁。如果另一个线程当前在 rw_lock 上持有读锁或写锁,当前线程将一直阻塞,直至所有其他线程都放弃了它们在 rw_lock 上的锁。

自版本: 2.32 起

g_rw_lock_writer_trylock

尝试获取 rw_lock 上的写锁。如果另一个线程当前在 rw_lock 上持有读锁或写锁,则立即返回 FALSE。否则锁定 rw_lock 并返回 TRUE。

自版本: 2.32 起

g_rw_lock_writer_unlock

释放 rw_lock 上的写锁。

自版本: 2.32 起