在前面章节介绍的《线程同步》都是默认属性,这里将要介绍在线程同步的互斥量、读写锁和条件变量的属性,可以指定一些属性来避免死锁等情况。
互斥量属性
互斥量属性可以用 pthread_mutexattr_t 数据结构来进行操作,属性的初始化操作如下:
/* 同步属性 */
/* 互斥量属性 */
/*
* 函数功能:初始化互斥量属性;
* 返回值:若成功则返回0,否则返回错误编码;
* 函数原型:
*/
#include <pthread.h>
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
/*
* 说明:
* pthread_mutexattr_init函数用默认的互斥量属性初始化pthread_mutexattr_t结构;
* 两个属性是进程共享属性和类型属性;
*/
/*
* 函数功能:获取或修改进程共享属性;
* 返回值:若成功则返回0,否则返回错误编码;
* 函数原型:
*/
#include <pthread.h>
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr, int *pshared);//获取互斥量的进程共享属性
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);//设置互斥量的进程共享属性
/*
* 说明:
* 进程共享互斥量属性设置为PTHREAD_PROCESS_PRIVATE时,允许pthread线程库提供更加有效的互斥量实现,这在多线程应用程序中是默认的;
* 在多个进程共享多个互斥量的情况下,pthread线程库可以限制开销较大的互斥量实现;
*/
/*
* 函数功能:获取或修改类型属性;
* 返回值:若成功则返回0,否则返回错误编码;
* 函数原型:
*/
int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);//获取互斥量的类型属性
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);//修改互斥量的类型属性
互斥量类型的控制如下所示:
互斥量类型 没有解锁时再次加锁 不占用时解锁 已解锁时再次解锁
PTHREAD_MUTEX_NORMAL 死锁 未定义 未定义
PTHREAD_MUTEX_ERRORCHECK 返回错误 返回错误 返回错误
PTHREAD_MUTEX_RECURSIVE 允许 返回错误 返回错误
PTHREAD_MUTEX_DEFAULT 未定义 未定义 未定义
读写锁属性
读写锁属性只有进程共享属性,其属性操作如下:
/* 读写锁属性 */
/*
* 函数功能:初始化读写锁属性;
* 返回值:若成功则返回0,否则返回错误编码;
* 函数原型:
*/
#include <pthread.h>
int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
/*
* 说明:
* 读写锁的唯一属性就是进程共享,该属性与互斥量的进程共享相同;
*/
/*
* 函数功能:获取或修改读写锁的进程共享属性;
* 返回值:若成功则返回0,否则返货错误编码;
* 函数原型:
*/
int pthread_rwlock_getpshared(const pthread_rwlockattr_t *attr, int *pshared);
int pthread_rwlock_setpshared(pthread_rwlockattr_t *attr, int pshared);
条件变量属性
条件变量也只有进程共享属性,其操作如下:
/* 条件变量属性 */
/*
* 函数功能:初始化条件变量属性;
* 返回值:若成功则返回0,否则返回错误编码;
* 函数原型:
*/
#include <pthread.h>
int pthread_condattr_init(pthread_condattr_t *attr);
int pthread_condattr_destroy(pthread_condattr_t *attr);
/*
* 函数功能:获取或修改进程共享属性;
* 返回值:若成功则返回0,否则返回错误编码;
* 函数原型:
*/
#include <pthread.h>
int pthread_condattr_getpshared(const pthread_condattr_t *attr, int *pshared);
int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared);
参考资料:
《UNIX高级环境编程》