Linux:读写锁

读写锁是一把锁,是互斥锁的升级版
互斥锁没有说明是锁定读还是锁定写,读写锁有两个功能分别对读和写操作进行锁定

锁的类型是pthread_rwlock_t
读写锁会记录自己现在是锁定状态还是非锁定状态
锁定状态下是读锁定还是写锁定

读写锁的特点

  • 使用读写锁对多线程进行同步,线程如果都是读操作,多线程可以并行访问临界区,这里与互斥锁不同
  • 线程同时读或者写,多线程在同一个时间点,线程可同时访问临界区,写操作不行,必须和互斥锁一样
  • 多线程对临界区进行读写操作时,写的优先级更高,因此多个写线程先抢读写锁,写线程全执行完再执行读线程

执行大量读操作时使用读写锁

函数

  • 初始化读写锁
    int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);
  • 释放读写锁占用的系统资源
    int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

rwlock读写锁的地址
attr读写锁的属性,一般采用默认属性给NULL
restrict用于修饰rwlock

加读锁,进行读操作

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)

  • 调用此函数,如果读写锁是打开的,那么加锁成功
  • 读写锁已锁定读操作,调用此函数依然可以加锁成功,因为读锁是共享的
    读写锁已锁定写操作,调用此这个函数的线程会被阻塞

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)

  • 调用此函数,如果读写锁是打开的,那么加锁成功;
  • 读写锁已锁定读操作,调用此函数依然可以加锁成功,因为读锁是共享的
  • 读写锁已锁定写操作,调用此函数加锁失败,对应的线程不会被阻塞
    可以在程序中对函数返回值进行判断,添加加锁失败之后的处理动作

加写锁,进行写操作

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)

  • 调用此函数,如果读写锁是打开的,那么加锁成功
    读写锁已锁定读操作/写操作,调用此函数的线程会被阻塞

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)

  • 调用此函数,如果读写锁是打开的,那么加锁成功
  • 读写锁已锁定读操作/写操作,调用此函数的线程不会阻塞

解锁

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux C中的是一种特殊的,它允许多个线程同时取共享资源,但只允许一个线程入共享资源。可以提高多线程程序的效率,特别是在取操作比入操作频繁的情况下。 的使用需要包含头文件pthread.h,并定义一个pthread_rwlock_t类型的变量作为的初始化可以使用pthread_rwlock_init函数,销毁可以使用pthread_rwlock_destroy函数。 的加和解分别有两个函数:pthread_rwlock_rdlock和pthread_rwlock_wrlock用于加,pthread_rwlock_unlock用于释放。 下面是一个简单的示例代码,演示了如何使用: ```c #include <stdio.h> #include <pthread.h> pthread_rwlock_t rwlock; // 定义 void* read_thread(void* arg) { pthread_rwlock_rdlock(&rwlock); // 加 printf("Read thread %ld is reading...\n", (long)arg); pthread_rwlock_unlock(&rwlock); // 解 return NULL; } void* write_thread(void* arg) { pthread_rwlock_wrlock(&rwlock); // 加 printf("Write thread %ld is writing...\n", (long)arg); pthread_rwlock_unlock(&rwlock); // 解 return NULL; } int main() { pthread_t tid[5]; pthread_rwlock_init(&rwlock, NULL); // 初始化 // 创建3个线程和2个线程 for (long i = 0; i < 3; i++) { pthread_create(&tid[i], NULL, read_thread, (void*)i); } for (long i = 3; i < 5; i++) { pthread_create(&tid[i], NULL, write_thread, (void*)i); } // 等待所有线程结束 for (int i = 0; i < 5; i++) { pthread_join(tid[i], NULL); } pthread_rwlock_destroy(&rwlock); // 销毁 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值