2012-06-22 68 views
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

rwlock->mutex互斥量用于保护rwlock结构本身的状态,而不是读者/写者锁可能在目标程序中保护的状态。该互斥锁仅在获取或释放锁的时间内保持。它只是简单地进入,以避免破坏读/写锁本身的“簿记”所需的状态。相比之下,读写器锁可以由锁定者在锁保护的结构上执行实际的读写操作持续一段较长的时间。

0

它将允许多个阅读或在同一时间,这比一个读取或一次一个写操作更好单个写。

2

在这两个函数中,rwlock->mutex在返回之前被释放。这意味着,仅仅因为你拥有一个读者或作家,并不意味着你持有这个互斥体。

rwlock的一半要点是多个读者可以同时操作,所以这与使用互斥锁相比是直接的优势。那些读者只是简单地持有这个互斥锁,以获得读者锁定。他们在实际工作时并不持有互斥体。

0

它比单纯使用pthread_mutex_lock更好吗?即使在这样的实施

  1. ,读者将在关键部分同时运行。
  2. 可能会有一个更好的(不太便携的)实现,它将在“快速路径”中使用原子(在等待时仍然需要锁定)。