zoukankan      html  css  js  c++  java
  • 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、当对数据(互斥锁中的临界区资源)进行读取时,需要上读取锁,当对数据进行写入时,需要上写入锁。

    读写锁的优点:

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

    者存在,提高了并发性。

  • 相关阅读:
    Codeforces 424C(异或)
    CodeForces
    Codeforces 424A (思维题)
    HDU 1197 Specialized Four-Digit Numbers
    ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
    HDU 1106 排序
    Codefroces 831B Keyboard Layouts
    POJ 1082 Calendar Game
    HDU 多校联合 6045
    HDU 5976 Detachment
  • 原文地址:https://www.cnblogs.com/guagua2016/p/5993396.html
Copyright © 2011-2022 走看看