1.属性类型:pthread_mutexattr_t
该类型是一个结构,其中存放了互斥量的各属性字段。在对互斥量初始化时,可以使用PTHREAD_MUTEX_INITIALIZER常量初始化,或在互斥量的初始化函数中的属性参数传递空指针。这样得到互斥量为默认属性。
2.初始化与反始化
对于非默认属性,可使用如下的函数对pthread_mutexattr_t结构进行初始化和反初始化。初始化后的结构为默认属性,其中每项属性的修改要交给之后介绍的相关函数。
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
//返回值:成功,返回0 否则返回错误编号
互斥量属性
a.进程共享属性
在POSIX中是可选的,可通过检查是否定义了_POSIX_THREAD_PROCESS_SHARED符号来判断系统是否支持该属性。
多个进程可以把一个内存数据快映射到自己的地址空间中,这个数据块就可以在多个进程间共享,所以就会涉及到同步问题。如果一个在共享数据块中分配的互斥量的进程共享属性设置为PTHREAD_PROCESS_SHARED,则该互斥量就可以用于进程间的同步。
//获取属性
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr, int *restrict pshared);
//修改属性
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
//返回值:成功,返回0 否则返回错误编号
b.健壮属性
健壮属性用于多进程共享的互斥量。当持有互斥量的进程终止时,需要解决互斥量状态恢复的问题。该属性默认值为PTHREAD_MUTEX_STALLED ,意味着持有互斥量的进程终止时不会有特别的动作。如果设置属性为PTHREAD_MUTEX_ROBUST,则在进程终止后,等待中的线程调用pthread_mutex_lock,会从中返回EOWNERREAD而不是0.
更详细内容见《APUE》中12.4节
c.类型属性
- PTHREAD_MUTEX_NORMAL
标准互斥量类型,不做特殊的错误检查和死锁检测。 - PTHREAD_MUTEX_ERRORCHECK
此类型提供错误检查。 - PTHREAD_MUTEX_RECURSIVE
递归类型,此种类型允许同一线程在互斥量解锁之前对该互斥量进行多次加锁。递归互斥量维护锁的计数,在解锁次数与加锁次数不同的情况下,不会释放锁。 - PTHREAD_MUTEX_DEFAULT
此类型提供默认特性,操作系统实现时会把它映射到上面三种中的一种上。linux映射到第一种标准类型上。
“不占用是解锁”指一个线程对被另一个线程加锁的互斥量解锁的情况。“已解锁时解锁”是指对一个已经解锁的互斥量解锁的情况。
互斥量类型 | 没有解锁时重新加锁 | 不占用时解锁 | 已解锁时解锁 |
---|---|---|---|
PTHREAD_MUTEX_NORMAL | 死锁 | 未定义 | 未定义 |
PTHREAD_MUTEX_ERRORCHECK | 返回错误 | 返回错误 | 返回错误 |
PTHREAD_MUTEX_RECURSIVE | 允许 | 返回错误 | 返回错误 |
PTHREAD_MUTEX_DEFAULT | 未定义 | 未定义 | 未定义 |
相关函数
//获取类型属性
int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict attr, int *restrict type);
//修改类型属性
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
//返回值:成功,返回0 否则返回错误编号