互斥量的属性:
互斥量的属性包括两个:进程共享属性和类型属性。
进程共享属性是可选的,可以通过检查系统中是否定义了_POSIX_THREAD_PROCESS_SHARED符号来判断这个平台是否支持进程共享这个属性,也可以在运行时把_SC_THREAD_PROCESS_SHARED参数传递给sysconf进行检查。在进程中,多个线程可以访问同一个同步对象。在这种情况下,进程共享互斥量属性需设置为PTHREAD_PROCESS_PRIVATE;在以后的文章(进程和进程间通信目录下)中会提到,存在这样的机制,允许相互独立的多个进程把同一个内存区域映射它们各自独立的地址空间中。就像多个线程访问共享数据一样,多个进程访问共享数据通常也需要同步。如果进程互斥量属性设置为PTHREAD_PROCESS_SHARED,从多个进程共享的内存区域中分配的互斥量就可以用于这些进程的同步。
类型属性:类型互斥量属性控制着互斥量的特性。有四种类型属性,分别为PTHREAD_MUTEX_TIMED_NP、PTHREAD_RECURSIVE_NP、PTHREAD_MUTEX_ERRORCHECK_NP、PTHREAD_MUTEX_APAPTIVE_NP。因为我用的是cent
os系统,与unix系统由一定区别,主要表现在宏名不同。如下文字段,摘自pthread.h
enum
{
PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_ADAPTIVE_NP
#ifdef __USE_UNIX98
,
PTHREAD_MUTEX_NORMAL =
PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE =
PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK =
PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_DEFAULT =
PTHREAD_MUTEX_NORMAL
#endif
#ifdef __USE_GNU
, PTHREAD_MUTEX_FAST_NP =
PTHREAD_MUTEX_TIMED_NP
#endif
};
互斥量属性初始化和回收:pthread_mutexattr_init()、pthread_mutexattr_destroy()
1、头文件:#include
2、函数原型:int
pthread_mutexattr_init(pthread_mutaxattr_t
*attr);
int pthread_mutex_destroy(pthread_mutexattr_t
*attr);
3、返回:成功返回0,失败返回错误编号。
互斥量进程共享属性查询和修改:pthread_mutexattr_getpshared()、pthread_mutexattr_setpshared()
1、头文件:#include
2、函数原型:int pthread_mutexattr_getpshared(const
pthread_mutexattr_t *restrict
attr,int *restrict
pshared);
int
pthread_mutexattr_setpshared(pthread_mutexattr_t
*attr,int pshared);
3、返回:成功时返回0。失败时返回错误编号。
4、参数说明:pshared表示进程的共享属性,pthread_mutexattr_getpshared()表示从pshared带出,pthread_mutexattr_setpshared()表示由pshared传入。
pshared允许值(至少两个吧,其他参数待查,有知道的朋友一定告诉我):
PTHREAD_PROCESS_PRIVATE:允许pthread线程库提供根据有效的互斥量的实现。这在多线程应用程序中是默认情况。在多个进程共享多个互斥量的情况下,pthread线程库可以限制开销较大的互斥量的实现。
PTHREAD_PROCESSED_SHARED:从多个进程共享的内存区域中分配的互斥量就可以用于这些进程的同步。
互斥量类型共享属性查询和修改:pthread_mutexattr_gettype()、pthread_mutexattr_settype()
1、头文件:#include
2、函数原型:int pthread_mutexattr_gettype(const
pthread_mutexattr_t *restrict
attr,int *restrict
type);
int
pthread_mutexattr_settype(pthread_mutexattr_t
*attr,int type);
3、返回:成功返回0,失败返回错误编号
4、参数:type上文已经由介绍了,我的CENT OS系统的允许的宏是:
PTHREAD_MUTEX_TIMED_NP:类似于unix下的PTHREAD_MUTEX_NORMAL,是标准的互斥量类型,并不做任何特殊的错误检查或死锁检测。在没有解锁前加锁会导致错误。一个线程创建的锁,可以由另外一个线程解除。
PTHREAD_RECURSIVE_NP:类似于unix下的PTHREAD_MUTEX_RECURSIVE,互斥量类型允许同一线程在互斥量解锁之前对该互斥量进行多次加锁。必须在加锁次数和解锁次数相同
的情况下才可以解锁。
PTHREAD_MUTEX_ERRORCHECK_NP:类似于unix下的PTHREAD_MUTEX_ERRORCHECK,互斥量类型提供错误检查。即一个线程加锁后,其他线程不能解锁,只能由它自己解除。
PTHREAD_MUTEX_APAPTIVE_NP:(不管,天知道是干嘛用的,,,呵呵~~~~~)
读写锁属性:仅支持进程共享属性
1、初始化、回收读写锁属性:pthread_rwlockattr_init()、pthread_rwlockattr_destroy()
A】函数原型:int
pthread_rwlockattr_init(pthread_rwlockattr_t
*attr);
int
pthread_rwlockattr_destroy(pthread_rwlockattr_t
*attr);
B】返回:成功返回0,失败返回错误编号。
2、读写锁进程共享属性查询与修改:pthread_rwlockattr_getpshared
()、pthread_rwlockattr_setpshared()
A】函数原型:int pthread_rwlockattr_getpshared(const
pthread_rwlockattr_t *restrict
attr,int *restrict
pshared);
int
pthread_rwlockattr_setpshared(pthread_rwlockattr_t
*attr,int pshared);
B】返回:成功返回0,失败返回错误编号。
条件变量属性:仅支持进程共享属性
1、初始化、回收条件变量属性:pthread_condattr_init()、pthread_condattr_destroy()
A】函数原型:int
pthread_condattr_init(pthread_condattr_t
*attr);
int
pthread_ condattr_destroy(pthread_ condattr_t
*attr);
B】返回:成功返回0,失败返回错误编号。
2、条件变量进程共享属性查询与修改:pthread_condattr_getpshared
()、pthread_condattr_setpshared()
A】函数原型:int
pthread_ condattr_getpshared(const
pthread_ condattr_t
*restrict attr,int
*restrict pshared);
int
pthread_ condattr_setpshared(pthread_ condattr_t
*attr,int pshared);
B】返回:成功返回0,失败返回错误编号。