2

我得到了一种读/写锁的实现,如下所示。请注意,在函数的开头,有一个pthread_mutex_lock调用。如果它仍然使用pthread_mutex_lock一次,那么使用读/写锁有什么好处。它比简单地使用更好pthread_mutex_lock吗?

int pthread_rwlock_rlock_np(pthread_rwlock_t *rwlock)
{
    pthread_mutex_lock(&(rwlock->mutex));
    rwlock->r_waiting++;
    while (rwlock->r_wait > 0)
    {
        pthread_cond_wait(&(rwlock->r_ok), &(rwlock->mutex));
    }
    rwlock->reading++;
    rwlock->r_waiting--;
    pthread_mutex_unlock(&(rwlock->mutex));
    return 0;
}

int pthread_rwlock_wlock_np(pthread_rwlock_t *rwlock)
{
    pthread_mutex_lock(&(rwlock->mutex));
    if(pthread_mutex_trylock(&(rwlock->w_lock)) == 0)
    {
        rwlock->r_wait = 1;
        rwlock->w_waiting++;
        while (rwlock->reading > 0)
        {
            pthread_cond_wait(&(rwlock->w_ok), &(rwlock->mutex));
        }
        rwlock->w_waiting--;
        pthread_mutex_unlock(&(rwlock->mutex));
        return 0;
    }
    else
    {
        rwlock->wu_waiting++;
        while (pthread_mutex_trylock(&(rwlock->w_lock)) != 0)
        {
            pthread_cond_wait(&(rwlock->w_unlock), &(rwlock->mutex));
        }
        rwlock->wu_waiting--;
        rwlock->r_wait = 1;
        rwlock->w_waiting++;
        while (rwlock->reading > 0)
        {
            pthread_cond_wait(&(rwlock->w_ok), &(rwlock->mutex));
        }
        rwlock->w_waiting--;
        pthread_mutex_unlock(&(rwlock->mutex));
        return 0;
    }
}
4

4 回答 4

4

rwlock->mutex互斥锁用于保护结构本身的rwlock状态,而不是保护目标程序中读/写锁可能保护的任何状态。该互斥锁仅在获取或释放锁期间保持。它只是简单地进入,以避免破坏读取器/写入器锁本身的“簿记”所需的状态。相反,读取器/写入器锁可能会被调用者在锁保护的结构上执行实际读取和写入而持有一段延长的时间。

于 2012-06-22T13:08:03.787 回答
2

在这两个函数中,rwlock->mutex在返回之前被释放。这意味着仅仅因为您持有 rwlock 作为读取器或写入器,并不意味着您持有互斥锁。

rwlock 的一半要点是多个读取器可以同时操作,因此与仅使用互斥锁相比,这是直接的优势。这些读者只是短暂地持有互斥锁,以获取读者锁。他们在进行实际工作时不会持有互斥锁。

于 2012-06-22T13:07:59.820 回答
0

它将允许一次多次读取或一次写入,这比一次读取一次或一次写入操作要好。

于 2012-06-22T13:07:54.017 回答
0

它比简单地使用 pthread_mutex_lock 更好吗?

  1. 即使使用此实现,阅读器也会在临界区同时运行。
  2. 可能会有一个更好(不太便携)的实现,它将在“快速路径”中使用原子(等待时仍然需要锁定)。
于 2012-06-22T13:10:10.990 回答