【Linux】互斥量属性

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 否则返回错误编号                       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值