互斥量属性mutexattr是什么


互斥锁属性
线程和线程的同步对象(互斥量,读写锁,条件变量)都具有属性。在修改属性前都需要对该结构进行初始化。比如使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值