先看下互斥量的结构如下,其中:__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实现/