• 读写锁的实现原理(pthread_rwlock_t)


    引言

    不同的锁之间的语义是不一样的,没有一劳永逸的锁,只有更适合的锁。

    如果是同一进程里的不同线程共享读写锁,那么读写锁变量的维护是在进程内部即可。如果是不同进程共享读写锁,那么读写锁变量的维护是在共享存储区。

    读写锁的分配规则:

    (1)只要没有线程占用写锁,那么任意数目的线程都可以持有这个读锁。

    (2)只要没有线程占用读写锁,那么才能为一个线程分配写锁。

    读锁相当于一个共享锁,写锁i相当于独占锁。

    和当初上操作系统讲的读者写者问题一样,只是当初好不理解啊。

    读写锁实现原理

     一种实现机制——互斥锁和条件变量。读者有兴趣可以自己实现一种。这种实现是一种写优先。

    1、pthread_rwlock_t数据结构

    typedef struct{
        pthread_mutex_t rw_mutex;// basic lock on this  struct
        pthread_cond_t  rw_condreaders;//for reader
        pthread_cond_t rw_condwriteres;//for writer
        
        int rw_magic;                  //for error checking
        int rw_nwaiterreaders;         //the num of readers
        int rw_nwaiterwirteres;        //the num of writers
        int rw_refcount;               //-1 is writer has this lock else reader has this lock
    }pthread_rwlock_t;

     rw_magic这个成员,如果没有设置属性的时候,创建锁的时候就会给予一个默认值(用于检查传递的锁是否是一个已经完成初始化的锁)。摧毁锁的时候,设置为0.

    rw_refcount这个成员,它是用来指示本读写锁的当前状态,-1表示写锁,0表示可用,>0则意味着有多个读进程占用该锁。

    申请一个读锁时,

    锁的释放,假定优先唤醒写操作:

     

    2、同一进程里面的不同线程,是可以相互取消的。相互取消这种情况还是会发生的,比如一个线程发现了一些错误,这些错误是致命的,所以要通知其他线程,你们别干了,再干下去还是会遇到错误,所以就把他们取消了。拿本设计结构来说,如果被取消的线程是获取了互斥锁,并且阻塞在pthread_cond_wait调用中,这个时候应该怎们办呢?因为,线程被动终止(可能没有解互斥锁的调用),而不是主动中止(有解互斥锁的调用),用到清理程序。清理程序会在线程终止时被调用,无需主动显式调用。

    pthread_cleanup_push(void (*func(void *)),void *arg);

    pthread_cleanup_pop(int excute);显式取消所注册的清理程序

  • 相关阅读:
    linux C/C++编程之库-动态库,静态库创建及使用
    类linux 系统iptables 系统初始化配置
    OS error set
    OpenWrt修改
    OpenWrt backfire trunk源码下载及编译
    OpenWrt compiles
    OpenWrt 学习网址
    nginx编译配置
    cocos2d-x中的坐标系
    SGU 231 Prime Sum 求<=n内有多少对素数(a,b)使得a+b也为素数 规律题
  • 原文地址:https://www.cnblogs.com/sylz/p/6030675.html
Copyright © 2020-2023  润新知