Linux读写锁的使用

读写锁是用来解决读者写者问题的,读操作可以共享,写操作是排它的,读可以有多个在读,写只有唯一个在写,写的时候不允许读。

具有强读者同步和强写者同步两种形式:

强读者同步:当写者没有进行写操作时,读者就可以访问;

强写者同步: 当所有写者都写完之后,才能进行读操作,读者需要最新的信息,一些实时性较高的系统会用到这种锁。

读写锁的初始化:

pthread_rwlock_t m_rw_lock;

pthread_rwlock_init(pthread_rwlock_t*, pthread_rwattr_t*);

获取读写锁的读锁操作:分为阻塞式获取和非阻塞式获取,如果读写锁由一个写者持有,则读线程会阻塞直到写入者释放读写锁。

阻塞式:pthread_rwlock_rdlock(pthread_rwlock_t);

非阻塞式:pthread_rwlock_tryrdlock(pthread_rwlock_t);

返回值:0,表示成功; 非0表示错误码;非阻塞会返回ebusy而不会让线程等待。

获取读写锁的写锁操作:分为阻塞和非阻塞,如果对应的读写锁被其它写者持有,或者读写锁被读者持有,该线程都会阻塞等待。

阻塞式:pthread_rwlock_wrlock(pthread_rwlock_t*);

非阻塞式:pthread_rwlock_trywrlock(pthread_rwlock_t*);

释放读写锁:

  pthread_rwlock_unlock(pthread_rwlock_t*);

互斥锁与读写锁的区别:

1、当访问临界区的资源时(访问的含义包括所有的操作),需要上互斥锁;

2、当对数据(互斥锁中的临界区资源)进行读取时,需要上读取锁,当对数据进行写入时,需要上写入锁。

读写锁的优点:

对于读数据较修改数据频繁的应用,用读写锁代替互斥锁可以提高效率。因为使用互斥锁时,即使是读出数据(相当于操作临界区资源)都需要上互斥锁;而采用读写锁则允许在任一时刻多个读出

者存在,提高了并发性。

原文地址:https://www.cnblogs.com/guagua2016/p/5993396.html