先看下互斥量的結構如下,其中:__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實現/