![一本书讲透Java线程:原理与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/887/51145887/b_51145887.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.5.1 创建互斥量
互斥量有两种创建方式:由静态变量分配与调用函数动态地创建。静态方式是POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁;动态方式是采用pthread_mutex_init函数来初始化互斥锁。创建互斥量的方法如代码清单1-13所示。
代码清单1-13 创建互斥量
![](https://epubservercos.yuewen.com/DEC20B/30156599704620806/epubprivate/OEBPS/Images/34_03.jpg?sign=1739036943-nlJyndBSjnByU1Cwa1rJK6NTKBMWLxli-0-1615da86c126848503d229bdab3d94ae)
mutex为互斥量对象,mutexattr用于指定互斥锁属性,如果为NULL则使用默认属性。互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同类型的锁在试图对已被锁定的互斥锁加锁时的表现不同。锁有4种类型,具体如表1-11所示。
表1-11 mutex锁类型
![](https://epubservercos.yuewen.com/DEC20B/30156599704620806/epubprivate/OEBPS/Images/34_04.jpg?sign=1739036943-lbapHTepkSQBPGYQkWVhUyDh02xohj4Z-0-7c051f045f5b917430bfaa26c1b2b313)
用PTHREAD_MUTEX_INITIALIZER创建的互斥量由系统自动回收,用pthread_mutex_init函数动态创建的互斥量需要手动调用pthread_mutex_destroy(pthread_mutex_t*mutex)函数来动态回收。
初始化互斥量之后,可以调用pthread_ mutex_ lock函数来获取互斥量锁,将互斥量设置为锁定状态。pthread_mutex_lock函数定义如代码清单1-14所示。
代码清单1-14 pthread_mutex_lock函数定义
![](https://epubservercos.yuewen.com/DEC20B/30156599704620806/epubprivate/OEBPS/Images/35_01.jpg?sign=1739036943-PGRYtEC5Jcbj1djpE1YS52rQ7maF5X8I-0-1375bd7046cb15225ec9917a5d55e451)
如果互斥量当前处于未锁定状态,则调用pthread_mutex_lock函数会锁定互斥量并立即返回。如果其他线程已经锁定了当前互斥量,那么pthread_mutex_ lock函数调用会一直被阻塞,直至该互斥量被其他线程解锁,才能锁定互斥量并返回。pthread_mutex_lock返回0表示锁定成功,其他的值都表示失败。