2012-06-22 4 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

mutex используется для защиты состояния самой структуры , а не от состояния блокировки чтения/записи в вашей целевой программе. Этот мьютекс удерживается только в течение времени, когда блокировка будет получена или выпущена. Он вводится только вкратце, чтобы избежать развращения состояния, которое необходимо для «бухгалтерии» самого блока чтения/записи. Напротив, блокировка считывателя/записи может удерживаться в течение длительного периода времени вызывающими абонентами, выполняющими фактические считывания и записи на структуре, защищающей замок.

0

Это будет позволяет кратное читать или одну запись в то время, которое лучше, чем один читать или одну операцию записи в то время.

2

В обеих функциях освобождается rwlock->mutex перед возвратом. Это означает, что только потому, что вы держите rwlock как читатель или писатель, не означает, что вы держите мьютекс.

Половина точки rwlock заключается в том, что несколько считывателей могут работать одновременно, поэтому это непосредственное преимущество перед использованием мьютекса. Эти читатели ненадолго удерживают мьютекс, чтобы получить блокировку считывателя. Они не удерживают мьютекс, пока они выполняют свою фактическую работу.

0

Как это лучше, чем просто использовать pthread_mutex_lock?

  1. Даже с этой реализацией, читатели будут одновременно работать в критической секции.
  2. Может быть лучше (менее портативная) реализация, которая использовала бы атомику в «быстром пути» (блокировка все равно понадобилась бы при ожидании).
Смежные вопросы