当前位置: 首页 > article >正文

linux c 读写锁pthread_rwlock

作用:防止多个线程同时对同一数据进行读写导致数据混乱,在读写这个数据前获取读写锁就行了

写写互斥,读写互斥,读读允许,同线程读写死锁

1.写写互斥

 一个线程获取了写锁,另一个线程再获取写锁将会阻塞

2.读写互斥

一个线程获取了读锁,另一个线程再获取写锁时将阻塞,反之亦然

3.读读允许

在其他线程没获取写锁时,任意数量的线程都可以获取读锁

4.同线程读写死锁

2的衍生

函数:

//定义且初始化互斥量
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

获取读锁

pthread_rwlock_rdlock(&rwlock);

获取写锁

pthread_rwlock_wrlock(&rwlock); 

释放读锁

pthread_rwlock_unlock(&rwlock);

 常用场景

#include "stdio.h"
#include "unistd.h"
#include "pthread.h"
#include "string.h"


//定义且初始化互斥量
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

//线程1
void* task1(void* p)
{
	printf("thread %d getting rdlock\n", pthread_self());
	pthread_rwlock_rdlock(&rwlock);//获取读锁
	printf("thread %d got rdlock!\n", pthread_self());

	sleep(5);
	pthread_rwlock_unlock(&rwlock);//释放读锁
	printf("thread %d release rdlock\n", pthread_self());
	return NULL;
}


int main()
{
	pthread_t thread;
	pthread_create(&thread, NULL, task1, NULL);
	pthread_create(&thread, NULL, task1, NULL);
	pthread_create(&thread, NULL, task1, NULL);//开启三个线程
	sleep(1);//等待子线程先获取读写锁

	printf("thread %d getting wrlock\n", pthread_self());
	pthread_rwlock_wrlock(&rwlock);

	printf("thread %d got wrlock!\n", pthread_self());

	
	return 0;
}

运行结果

可以看到主线程在三个子线程的读锁释放后才成功获取写锁

写饥饿现象:

当持续不断的有新的线程获取读锁又释放,就可能会出现一个现象,因为读读允许,所有可能会很长时间一直有不同的线程正在读,这样写入线程一直无法获取到写锁,这就是写饥饿,可以通过初始化设置将该读写锁设置为:有线程在写阻塞时新的读锁获取也阻塞。

这样就不会有新的线程获取读锁,等当前存在的读锁都释放后写线程就得以运行。

pthread_rwlockattr_t rwlockattr;//读写锁属性变量
pthread_rwlockattr_init(&rwlockattr);//初始化读写锁属性变量
pthread_rwlockattr_setkind_np(&rwlockattr,   PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
);//初始化读写锁属性调度策略设为写优先
pthread_rwlock_t rwlock;//读写锁
pthread_rwlock_init(&rwlock, &rwlockattr);//读写锁以读写锁属性变量初始化

http://www.kler.cn/a/548617.html

相关文章:

  • 11. Docker 微服务实战(将项目打包生成镜像,在 Docker 当中作为容器实例运行)
  • 现在有什么赛道可以干到退休?
  • 3D打印学习
  • 53倍性能提升!TiDB 全局索引如何优化分区表查询?
  • 传感器篇(一)——深度相机
  • linux系统测试网络pps、带宽和延时(方案来源于阿里云)
  • 向量元素间是否相等mask矩阵
  • 日常知识点之遗留问题梳理(被问到用uml画设计模式)
  • CAS单点登录(第7版)1.首页
  • conda在powershell7.5执行出现问题
  • 亚远景-ASPICE 4.0与敏捷开发:如何实现高效协同
  • 数据结构 二叉树
  • Win11 远程 连接 Ubuntu20.04(局域网)
  • 使用 VMware 实现虚拟化基础架构
  • 服务器延迟给视频网站造成的影响
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_regex_init 函数
  • mysql用户名怎么看
  • 股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDMA、KDJ等指标数据配有API说明文档
  • PyQt6/PySide6 的 SQL 数据库操作(QtSql)
  • 1-6 gitee提交后绿点