2012-06-22 91 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. 可能會有一個更好的(不太便攜的)實現,它將在「快速路徑」中使用原子(在等待時仍然需要鎖定)。