• 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);

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

    原文

  • 相关阅读:
    从首页看CCS布局
    Community Server专题一:概述Community Server
    datagrid程序增加列的方法
    类的关键字
    base 关键字用于从派生类中访问基类的成员:
    关于CS1.1后台管理页面的研究
    如何:创建同步 HTTP 处理程序
    Community Server专题二:体系结构
    SqlTransaction 类
    单继承与多实现
  • 原文地址:https://www.cnblogs.com/xiaoxiaoboke/p/2349785.html
Copyright © 2020-2023  润新知