Linux系列-关于Pthread加锁解锁的的实现原理


先看下互斥量的结构如下,其中:__owner 表示获得锁的线程id,__count 表示重入次数,__lock 表示锁标识,mutex->__lock的值只有三种可能:0,1,2。0:很显然,没有人获得锁的情况下自然是0。1:当只有一个线程调用pthread_mutex_lock()的时候,mutex->__lock的值被更改为1,如果在此之后没有其他的线程争用该mutex,那么这个mutex->__lock的值就会一直未1,知道unlock把他更新为0。2:在值为1的时候,如果再次有其他的线程调用pthread_mutex_lock(),mutex->__lock的值就会被设置成2。所以当有多个线程争用同一把锁的时候,该值就会被设置成2。

/* /usr/include/bits/pthreadtypes.h */
typedef union {
  struct __pthread_mutex_s  {
    int __lock;
    unsigned int __count;
    int __owner;
    unsigned int __nusers;
    int __kind;
    int __spins;
    __pthread_list_t __list;
  } __data;
  char __size[__SIZEOF_PTHREAD_MUTEX_T];
  long int __align;
} pthread_mutex_t;

LLL_MUTEX_LOCK会调用到__lll_lock,__lll_lock用atomic_compare_and_change_bool_acq()更改mutex->__lock的值,如果更改成功,表示mutex->__lock的原始值0,上锁成功。如果上原子比较交换指令不成功,就调用__lllock_wait/__lll_lock_wait_private()这两个函数中的一个。

pthread_mutex_lock源码分析:http://m.blog.chinaunix.net/uid-29680694-id-5768578.html
关于glibc源码:https://github.com/lattera/glibc/tree/master/nptl
关于 pthread_mutex_lock实现:https://www.cnblogs.com/pslydff/p/7041444.html
Glibc中NPTL库mutex实现原理抽象解析: https://zhuanlan.zhihu.com/p/343845048
linux 内核的futex:https://www.cnblogs.com/bbqzsl/p/6757923.html
[并发系列-5] 从AQS到futex(三): glibc(NPTL)的mutex/cond实现
http://kexianda.info/2017/08/17/并发系列-5-从AQS到futex三-glibc-NPTL-的mutex-cond实现/


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM