读写锁

读写锁与互斥量类似,不过读写锁允许更高的并行性。互斥量只有两种状态:锁住状态,不加锁状态,一次只能有一个线程可以对其加锁。读写锁可以有3种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只能有一个线程占用写模式的读写锁,但是多个线程可以同时占用读模式的读写锁(读模式共享)。

当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞(不能同时写,写时也不能被读)。当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是任何希望以写模式对此锁进行加锁的线程都会阻塞,直到所有的线程释放他们为止。当读写锁处于读模式锁住的状态时,有一个线程试图以写模式获取锁时,读写锁通常会阻塞随后的读模式锁请求。这样可以避免读模式锁长期占有,而等待的写模式锁请求一直等不到满足。

 

读写锁适合于对资源读的次数远大于写的情况。

当读写锁在写模式下,它所保护的数据可以被安全的修改,因为一次只有一个线程可以在写模式下拥有这个锁。

只要线程先获取了读模式下的读写锁,即读写锁处于读模式下,该锁保护的数据可以被获得读模式锁的线程读取。

读写锁也叫共享互斥锁。当读写锁是读模式锁住时,称为以共享模式锁住的。当它是写模式锁住的时候,称为以互斥模式锁住的。

各种实现可能会对共享模式下可获取读写锁的次数进行限制,因此需要检查获取读模式下读写锁时函数的返回值。

 

为避免在获取读写锁时陷入永久阻塞状态,读写锁也提供了条件版本和带有超时的读写锁加锁函数。

条件版本:

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

可以获取锁时,这两个函数返回0,。否则,返回错误EBUSY。

带有超时的读写锁加锁:

int pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict rwlock,
              const struct timespec *restrict abs_timeout);
int pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rwlock,
              const struct timespec *restrict abs_timeout);    

 

posted @ 2019-07-06 16:28  大白的攻城狮  阅读(422)  评论(0编辑  收藏  举报