pthread 读写锁使用详解

pthread 读写锁使用

  • 读写锁:提供了一种高效的机制来控制对共享资源的访问。允许多个线程同时读取共享资源,但只允许一个线程独占地写入访问。
  • 适用于读取远远超过写入的场景下,因为写入操作需要独占地访问资源,可能会影响读取操作的性能。

pthread_rwlock_init

  • 函数原型:

    int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
    
    • rwlock:指向要初始化的读写锁对象的指针。
    • attr:可选的指向读写锁属性对象的指针,可以为 NULL。
    • 返回值:成功返回 0,失败返回错误代码。
  • 用于初始化读写锁对象。

  • 使用读写锁时,应该先初始化再使用,最后再销毁。

pthread_rwlock_destroy

  • 函数原型:

    int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
    
    • rwlock:指向要销毁的读写锁对象的指针。
  • 用于销毁一个读写锁对象,释放相关的资源。

  • 销毁读写锁之前,要确保没有任何线程正在持有该读写锁,否则会导致未定义的结果。

pthread_rwlock_rdlock

  • 函数原型:

    int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
    
    • rwlock: 指向要获取的读写锁对象的指针。
  • 用于获取读取锁。如果当前没有其他线程持有该锁对象的写入锁,则该函数成功返回0并立即返回;否则,该函数将阻塞等待直到写入操作完成,并且当前线程可以安全地读取共享资源。

  • 允许多个线程同时读取共享资源,但不允许写入操作。

pthread_rwlock_rwlock

  • 函数原型:

    int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
    
    • rwlock: 指向要获取的读写锁对象的指针。
  • 用于获取写入锁,如果当前没有其他线程持有该锁对象的任何锁,则该函数成功返回0并立即返回;否则,该函数将阻塞等待直到其他线程释放该锁,然后当前线程可以独占地修改共享资源。

pthread_rwlock_unlock

  • 函数原型:

    int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
    
    • rwlock: 指向要释放的读写锁对象的指针。
  • 释放指定的读写锁对象的读取锁或写入锁。如果当前线程没有持有该锁,则该函数的行为是未定义的。

示例

  • 以下示例演示了两个线程同时读取一个变量,一个线程独占地修改变量:

    #include <stdio.h>
    #include <string.h>
    #include <pthread.h>
    
    pthread_rwlock_t g_rwlock;
    
    void* thread1_func(void* arg)
    {
        int *var = (int*)arg;
    
        // 获取读取锁
        pthread_rwlock_rdlock(&g_rwlock);
    
        printf("thread1 read var is %d\n", *var);
    
        // 释放读取锁
        pthread_rwlock_unlock(&g_rwlock);
        return NULL;
    }
    
    void* thread2_func(void* arg)
    {
        int *var = (int*)arg;
    
        // 获取读取锁
        pthread_rwlock_rdlock(&g_rwlock);
    
        printf("thread2 read var is %d\n", *var);
    
        // 释放读取锁
        pthread_rwlock_unlock(&g_rwlock);
        return NULL;
    }
    
    void* thread3_func(void* arg)
    {
        int *var = (int*)arg;
    
        // 获取写入锁
        pthread_rwlock_wrlock(&g_rwlock);
    
        *var = 100;
        printf("thread3 write var is %d\n", *var);
    
        // 释放写入锁
        pthread_rwlock_unlock(&g_rwlock);
        return NULL;
    }
    
    int main()
    {
        // 初始化读写锁
        pthread_rwlock_init(&g_rwlock, NULL);
    
        // 创建线程
        int var = 10;
        pthread_t th1;
        pthread_t th2;
        pthread_t th3;
        pthread_create(&th1, NULL, thread1_func, &var);
        pthread_create(&th2, NULL, thread2_func, &var);
        pthread_create(&th3, NULL, thread3_func, &var);
    
        // 等待线程结束
        pthread_join(th1, NULL);
        pthread_join(th2, NULL);
        pthread_join(th3, NULL);
    
        // 销毁读写锁
        pthread_rwlock_destroy(&g_rwlock);
        return 0;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注的罗哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值