互斥锁属性
互斥锁属性
线程和线程的同步对象(互斥量,读写锁,条件变量)都具有属性。在修改属性前都需要对该结构进行初始化。比如使用pthread_mutex_init初始化互斥锁,同样要对其属性进行设置,也要有pthread_mutexattr_init来初始化互斥锁属性对象
pthread_mutexattr_init
pthread_mutexattr_init
函数用于初始化一个互斥锁属性对象,使其处于默认状态。
函数原型
#include <pthread.h>
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
参数
attr
: 指向互斥锁属性对象的指针。
返回值
- 成功时返回
0
。 - 失败时返回错误码,例如
EINVAL
,表示参数无效。
pthread_mutexattr_destroy
pthread_mutexattr_destroy
函数用于销毁一个互斥锁属性对象,并释放其占用的资源。
函数原型
#include <pthread.h>
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
参数
attr
: 指向互斥锁属性对象的指针。
返回值
- 成功时返回
0
。 - 失败时返回错误码,例如
EINVAL
,表示参数无效或属性对象未初始化。
程序
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
int main() {
pthread_mutexattr_t attr;
pthread_mutex_t mutex;
// 初始化互斥锁属性
if (pthread_mutexattr_init(&attr) != 0) {
perror("pthread_mutexattr_init");
exit(EXIT_FAILURE);
}
// 可以在这里设置其他属性,比如进程共享等
if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED) != 0) {
perror("pthread_mutexattr_setpshared");
pthread_mutexattr_destroy(&attr); // 销毁属性对象
exit(EXIT_FAILURE);
}
// 初始化互斥锁
if (pthread_mutex_init(&mutex, &attr) != 0) {
perror("pthread_mutex_init");
pthread_mutexattr_destroy(&attr); // 销毁属性对象
exit(EXIT_FAILURE);
}
// 互斥锁使用代码...
// 清理资源
pthread_mutex_destroy(&mutex);
pthread_mutexattr_destroy(&attr); // 销毁属性对象
return 0;
}
pthread_mutexattr_init将属性对象的值初始化为缺省值。并分配属性对象占用的内存空间,之后可以使用setpshared设置属性对象要创建的互斥锁的作用域。
互斥量属性分为共享互斥量属性和类型互斥量属性。两种属性分别由不同的函数得到并由不同的函数进行修改
获得和修改共享互斥量属性
- pthread_mutexattr_getpshared
- pthread_mutexattr_setpshared
获得和修改类型互斥量属性
- pthread_mutexattr_gettype
- pthread_mutexattr_settype
共享互斥量属性用于规定互斥锁的作用域。互斥锁的域可以是同一个进程的不同线程,也可以是不同进程间的线程。
pthread_mutexattrattr_ getpshared可以返回属性对象的互斥锁作用域属性。
取值:
- PTHREAD_PROCESS_SHARED,
- PTHREAD_PROCESS_PRIVATE。
如果互斥锁属性对象的pshared属性被置PTHREAD_PROCESS_SHARED。那么由这个属性对象创建的互斥锁将被保存在共享内存中,可以被多个进程中的线程共享。
如果pshared属性被置为PTHREAD_PROCESS_PRIVATE,那么只有和创建这个互斥锁的线程在同一个进程中的线程才能访问这个互斥锁。
pthread_mutexattr_getpshared
pthread_mutexattr_getpshared
是一个用于获取互斥锁属性对象的进程共享属性的函数。它允许你检查一个互斥锁是否可以被不同进程中的线程共享,或者仅限于同一进程中的线程使用。
函数原型
#include <pthread.h>
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr, int *pshared);
参数说明
attr
: 指向互斥锁属性对象的指针。pshared
: 指向一个整数的指针,函数将把进程共享的值存储在这个整数中。- PTHREAD_PROCESS_PRIVATE 互斥锁只能被同一进程中的线程使用;
- PTHREAD_PROCESS_SHARED 互斥锁可以被不同进程中的线程使用
返回值
- 成功时返回
0
。 - 失败时返回错误码,例如
EINVAL
表示属性对象无效。
程序
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
int main() {
pthread_mutexattr_t attr;
pthread_mutex_t mutex;
int pshared;
// 初始化互斥锁属性
if (pthread_mutexattr_init(&attr) != 0) {
perror("pthread_mutexattr_init");
exit(EXIT_FAILURE);
}
// 设置互斥锁为进程共享
if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED) != 0) {
perror("pthread_mutexattr_setpshared");
exit(EXIT_FAILURE);
}
// 使用属性初始化互斥锁
if (pthread_mutex_init(&mutex, &attr) != 0) {
perror("pthread_mutex_init");
exit(EXIT_FAILURE);
}
// 获取 pshared 属性
if (pthread_mutexattr_getpshared(&attr, &pshared) != 0) {
perror("pthread_mutexattr_getpshared");
exit(EXIT_FAILURE);
}
// 打印 pshared 值
if (pshared == PTHREAD_PROCESS_PRIVATE) {
printf("互斥锁是进程私有的。\n");
} else if (pshared == PTHREAD_PROCESS_SHARED) {
printf("互斥锁是进程共享的。\n");
}
// 清理资源
pthread_mutex_destroy(&mutex);
pthread_mutexattr_destroy(&attr);
return 0;
}
pthread_mutexattr_gettype
pthread_mutexattr_gettype
是一个用于获取互斥锁属性对象的类型的函数。互斥锁可以有不同的类型,如普通互斥锁、递归互斥锁等。这个函数允许你查询互斥锁属性对象的类型,以便在使用互斥锁时能够正确地处理它。
函数原型
#include <pthread.h>
int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);
参数说明
attr
: 指向互斥锁属性对象的指针。type
: 指向一个整数的指针,函数将把互斥锁类型存储在这个整数中。可能的值包括:-
PTHREAD_MUTEX_NORMAL
: 普通互斥锁。 -
PTHREAD_MUTEX_RECURSIVE
: 递归互斥锁。 -
PTHREAD_MUTEX_ERRORCHECK
: 错误检查互斥锁。
如果一个线程试图对一个互斥锁重复锁定,将会返回一个错误代码。如果试图解锁一个由别的线程锁定的互斥锁将会返回一个错误代码。如果一个线程试图解锁已经被解锁的互斥锁也将会返回一个错误代码。 -
PTHREAD_MUTEX_DEFAULT
: 默认类型,通常与PTHREAD_MUTEX_NORMAL
相同。
-
返回值
- 成功时返回
0
。 - 失败时返回错误码,例如
EINVAL
,表示属性对象无效。
代码
如何使用 pthread_mutexattr_gettype
来获取互斥锁的类型:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
int main() {
pthread_mutexattr_t attr;
pthread_mutex_t mutex;
int type;
// 初始化互斥锁属性
if (pthread_mutexattr_init(&attr) != 0) {
perror("pthread_mutexattr_init");
exit(EXIT_FAILURE);
}
// 设置互斥锁为递归类型
if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) {
perror("pthread_mutexattr_settype");
pthread_mutexattr_destroy(&attr); // 销毁属性对象
exit(EXIT_FAILURE);
}
// 初始化互斥锁
if (pthread_mutex_init(&mutex, &attr) != 0) {
perror("pthread_mutex_init");
pthread_mutexattr_destroy(&attr); // 销毁属性对象
exit(EXIT_FAILURE);
}
// 获取互斥锁类型
if (pthread_mutexattr_gettype(&attr, &type) != 0) {
perror("pthread_mutexattr_gettype");
pthread_mutex_destroy(&mutex); // 销毁互斥锁
pthread_mutexattr_destroy(&attr); // 销毁属性对象
exit(EXIT_FAILURE);
}
// 打印互斥锁类型
switch (type) {
case PTHREAD_MUTEX_NORMAL:
printf("互斥锁类型:普通互斥锁。\n");
break;
case PTHREAD_MUTEX_RECURSIVE:
printf("互斥锁类型:递归互斥锁。\n");
break;
case PTHREAD_MUTEX_ERRORCHECK:
printf("互斥锁类型:错误检查互斥锁。\n");
break;
case PTHREAD_MUTEX_DEFAULT:
printf("互斥锁类型:默认互斥锁。\n");
break;
default:
printf("互斥锁类型:未知类型。\n");
}
// 清理资源
pthread_mutex_destroy(&mutex);
pthread_mutexattr_destroy(&attr); // 销毁属性对象
return 0;
}
编译
gcc -o mutex_example mutex_example.c -pthread
./mutex_example