Duangw

互斥锁属性对象

索引:

  1. 初始化互斥锁属性对象pthread_mutexattr_init
  2. 释放互斥锁属性对象pthread_mutexattr_destroy
  3. 设置作用域属性pthread_mutexattr_setpshared
  4. 取作用域属性pthread_mutexattr_getpshared
  5. 设置互斥锁类型属性pthread_mutexattr_settype
  6. 获取互斥锁类型属性pthread_mutexattr_gettype

1.初始化互斥锁属性对象pthread_mutexattr_init

#include <pthread.h>
int pthread_mutexattr_init(pthread_mutexattr_t *mattr);
返回值:函数成功返回0;任何其他返回值都表示错误

将属性对象的值初始化为缺省值。并分配属性对象占用的内存空间。

mattr中pshared属性表示用这个属性对象创建的互斥锁的作用域,它的取值可以是PTHREAD_PROCESS_PRIVATE(缺省值,表示由这个属性对象创建的互斥锁只能在进程内使用)或PTHREAD_PROCESS_SHARED。

 

2.释放互斥锁属性对象pthread_mutexattr_destroy

#include <pthread.h>
int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr);
返回值:函数成功返回0;任何其他返回值都表示错误

释放互斥锁属性对象占用的内存(这些内存是由pthread_mutexattr_init()函数分配的)。

 

3.设置作用域属性pthread_mutexattr_setpshared

#include <pthread.h>
int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr,
int pshared);
返回值:函数成功返回0;任何其他返回值都表示错误

设置互斥锁的域。

互斥锁的域可以是进程内的也可以是进程间的。如果互斥锁属性对象的pshared属性被置为PTHREAD_PROCESS_SHARED。那么由这个属性对象创建的互斥锁将被保存在共享内存中,可以被多个进程中的线程共享。

如果pshared属性被置为PTHREAD_PROCESS_PRIVATE,那么只有和创建这个互斥锁的线程在同一个进程中的线程才能访问这个互斥锁。

 

4.取作用域属性pthread_mutexattr_getpshared

#include <pthread.h>
int pthread_mutexattr_getpshared(pthread_mutexattr_t *mattr,
int *pshared);
返回值:函数成功返回0;任何其他返回值都表示错误

返回属性对象的互斥锁作用域属性。可以是以下值:PTHREAD_PROCESS_SHARED, PTHREAD_PROCESS_PRIVATE。

 

5.设置互斥锁类型属性pthread_mutexattr_settype

#include <pthread.h>
int pthread_mutexattr_settype(pthread_mutexattr_t *attr,
int type);
返回值:函数成功返回0;任何其他返回值都表示错误

设置互斥锁类型属性。缺省的互斥锁类型属性是PTHREAD_MUTEX_DEFAULT。

合法的类型属性值有:

类型说明:

PTHREAD_MUTEX_NORMAL

这种类型的互斥锁不会自动检测死锁。如果一个线程试图对一个互斥锁重复锁定,将会引起这个线程的死锁。如果试图解锁一个由别的线程锁定的互斥锁会引发不可预料的结果。如果一个线程试图解锁已经被解锁的互斥锁也会引发不可预料的结果。

PTHREAD_MUTEX_ERRORCHECK

这种类型的互斥锁会自动检测死锁。如果一个线程试图对一个互斥锁重复锁定,将会返回一个错误代码。如果试图解锁一个由别的线程锁定的互斥锁将会返回一个错误代码。如果一个线程试图解锁已经被解锁的互斥锁也将会返回一个错误代码。

PTHREAD_MUTEX_RECURSIVE

如果一个线程对这种类型的互斥锁重复上锁,不会引起死锁,一个线程对这类互斥锁的多次重复上锁必须由这个线程来重复相同数量的解锁,这样才能解开这个互斥锁,别的线程才能得到这个互斥锁。如果试图解锁一个由别的线程锁定的互斥锁将会返回一个错误代码。如果一个线程试图解锁已经被解锁的互斥锁也将会返回一个错误代码。这种类型的互斥锁只能是进程私有的(作用域属性为PTHREAD_PROCESS_PRIVATE)。

PTHREAD_MUTEX_DEFAULT

这种类型的互斥锁不会自动检测死锁。如果一个线程试图对一个互斥锁重复锁定,将会引起不可预料的结果。如果试图解锁一个由别的线程锁定的互斥锁会引发不可预料的结果。如果一个线程试图解锁已经被解锁的互斥锁也会引发不可预料的结果。POSIX标准规定,对于某一具体的实现,可以把这种类型的互斥锁定义为其他类型的互斥锁。

 

6.获取互斥锁类型属性pthread_mutexattr_gettype

#include <pthread.h>
int pthread_mutexattr_gettype(pthread_mutexattr_t *attr,
int *type);
返回值:函数成功返回0;任何其他返回值都表示错误

取互斥锁类型属性。