zoukankan      html  css  js  c++  java
  • Linux下线程同步对象(2)——读写锁

    上文介绍了Linux下线程同步对象——互斥量,本文介绍另外Linux下同步对象——读写锁。

         如果多个线程同时读资源,则不会发生竞争关系,也不会出现资源的不一致性,所以读资源的时候不需要同步对象保护。但是如果写某个资源的时候,必须要进行同 步保护,否则将会出现不一致性。在上文的互斥量中,不管读写都加锁,这样对于读资源操作非常多,但写资源非常少的情况下,效率会比较低。Linux提供了 读写锁来解决这种情况下的效率问题。

         读写锁分为读锁定状态和写锁定状态,多个线程可以同时获得读锁定状态锁,进行各自的读操作。但是写锁定状态只能有一个线程获得,其他的线程线程的读锁定请求和写锁定请求都将会阻塞,直到当前的写锁定状态释放。

         创建和销毁读写锁用如下函数:

           #include <pthread.h>
    
           int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
           int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
                  const pthread_rwlockattr_t *restrict attr);

         为读写锁加读锁定状态函数如下:

           #include <pthread.h>
    
           int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
           int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

    pthread_rwlock_rdlock若当前读写锁为未加锁状态或者为读锁定状态,该函数都可以获得读写锁并返回;若该读写锁为写锁定状态,则该函数将阻塞调用线程,直到该读写锁的写锁定状态释放。pthread_rwlock_tryrdlock若当前读写锁为未加锁状态或者为读锁定状态,该函数都可以获得读写锁并返回;若该读写锁为写锁定状态,则该函数将立即返回错误(错误码为EBUSY),不阻塞调用线程。

         为读写锁加写锁定状态的函数如下:

           #include <pthread.h>
    
           int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
           int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

    pthread_rwlock_wrlock如果当前读写锁状态为未锁定,则该函数锁定该锁,并立即返回;如果该锁的状态为读锁定状态或者写锁定状态,则该函数将阻塞调用线程,直到该锁的读写状态被释放。pthread_rwlock_trywrlock如果当前读写锁状态为未锁定锁定,则该函数锁定该锁,并立即返回;如果该锁的状态为读锁定状态或者写锁定状态,则该函数立即返回,并返回错误码EBUSY,不阻塞调用线程。

         解除读写锁的锁定状态函数如下:

           #include <pthread.h>
    
           int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

    不管是读锁定状态和写锁定状态都调用这个函数接触锁定。

    原文

  • 相关阅读:
    C++ Boost 函数与回调应用
    C++ Boost库 操作字符串与正则
    C++ Boost库 实现命令行解析
    PHP 开发与代码审计(总结)
    c strncpy函数代码实现
    c strcat函数代码实现
    c strcpy函数代码实现
    c strlen函数代码实现
    Java-IO流-打印流
    Java-IO流-文件复制2
  • 原文地址:https://www.cnblogs.com/xiaoxiaoboke/p/2349785.html
Copyright © 2011-2022 走看看