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

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);//读写锁以读写锁属性变量初始化

相关文章:

  • 3D打印技术:如何让古老文物重获新生?
  • MYSQL直接在SQL提取json字符串中的内容-----将13位时间戳转换成标准的日期格式【记录SQL常用函数】
  • 【如何掌握CSP-J 信奥赛中的模拟算法】
  • Python深度学习代做目标检测NLP计算机视觉强化学习
  • 【Linux系统】—— 简易进度条的实现
  • C++中运算符的底层是不是用函数实现的?
  • MATLAB使用技巧之局部放大图的制作(二)
  • 算法服务器跟算力卡有什么区别?
  • Eclipse JSP/Servlet 深入解析
  • 【C语言 】C语言 桌游开发数字竞拍(源码)【独一无二】
  • 微信小程序开发实用技巧篇
  • 支持列表拖拽嵌套,AI流式输出的多模态文档编辑器flowmix/docx: 全面升级
  • SQL Server:查看内存使用情况
  • 信号与系统第二章学习(五)
  • npm安装时无法访问github域名的解决方法
  • 网络安全事件分级
  • 图像变换:了解透视变换原理及OpenCV实现
  • qt QToolButton使用总结
  • qt中部件存储自定义数据
  • 《网络编程卷2:进程间通信》第四章:管道与FIFO深度解析
  • 赣州蓉江新区党工委原书记王凌主动交代问题,正接受审查调查
  • 国家发改委:内卷式竞争扭曲市场机制、扰乱公平竞争秩序,必须整治
  • 俄罗斯哈巴罗夫斯克市首次举办“俄中论坛”
  • 完善劳动关系协商协调机制,《共同保障劳动者合法权益工作指引》发布
  • 习近平:坚持科学决策民主决策依法决策,高质量完成“十五五”规划编制工作
  • 俄乌刚谈完美国便筹划与两国领导人通话,目的几何?