nng协议分析之互斥锁pthread_mutexattr_settype函数

此函数位于nni_plat_init ,是对线程锁的属性初始化

pthread_mutexattr_settype 是一个用于设置互斥锁属性类型的函数。通过这个函数,可以指定互斥锁的类型,以控制不同的锁定行为。

函数原型

#include <pthread.h>

int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);


参数说明

- attr:指向互斥锁属性对象 (pthread_mutexattr_t) 的指针。
- type:互斥锁的类型。常见的类型包括:


  - PTHREAD_MUTEX_NORMAL:普通的互斥锁。当一个线程试图再次锁定一个已经锁定的互斥锁时,会发生死锁。


  - PTHREAD_MUTEX_ERRORCHECK:错误检查互斥锁。当一个线程试图再次锁定一个已经锁定的互斥锁时,会返回错误。NNG协议使用的类型就是此类型


  - PTHREAD_MUTEX_RECURSIVE:递归互斥锁。同一个线程可以多次锁定一个已经锁定的互斥锁,但必须解锁相同次数。


  - PTHREAD_MUTEX_DEFAULT:默认的互斥锁类型,通常等同于 PTHREAD_MUTEX_NORMAL。

返回值

- 0:成功。
- 非零错误码:失败。

示例代码下面是一个如何使用 pthread_mutexattr_settype 的示例:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void* thread_function(void* arg) {
    pthread_mutex_t* mutex = (pthread_mutex_t*)arg;

    pthread_mutex_lock(mutex);
    printf("Thread %ld: Locked the mutex.\n", pthread_self());

    // 模拟一些工作
    sleep(1);

    pthread_mutex_unlock(mutex);
    printf("Thread %ld: Unlocked the mutex.\n", pthread_self());

    return NULL;
}

int main() {
    pthread_mutexattr_t attr;
    pthread_mutex_t mutex;
    pthread_t thread;

    // 初始化互斥锁属性
    pthread_mutexattr_init(&attr);

    // 设置互斥锁类型为递归锁
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);

    // 使用属性初始化互斥锁
    pthread_mutex_init(&mutex, &attr);

    // 创建线程
    pthread_create(&thread, NULL, thread_function, (void*)&mutex);

    // 主线程也锁定和解锁互斥锁
    pthread_mutex_lock(&mutex);
    printf("Main thread: Locked the mutex.\n");

    // 模拟一些工作
    sleep(1);

    pthread_mutex_unlock(&mutex);
    printf("Main thread: Unlocked the mutex.\n");

    // 等待线程结束
    pthread_join(thread, NULL);

    // 销毁互斥锁和属性
    pthread_mutex_destroy(&mutex);
    pthread_mutexattr_destroy(&attr);

    return 0;
}


在这个例子中,互斥锁 mutex 被配置为递归锁类型 (PTHREAD_MUTEX_RECURSIVE),这允许同一个线程多次锁定互斥锁。主线程和新创建的线程都尝试锁定和解锁互斥锁,以演示其使用。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值