结构体
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_reader_lock
获取 rw_lock 上的读锁。如果另一个线程当前在 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 起