Linux下,为了线程安全,为我们提供了很多种锁。

读写锁: 我们在编写多线程的时候,我们可能需要经常去读取某个共享数据变量,但是相对要改写这个变量的机会相对较少。在读的过程中,往往伴随着查找的操作,中间耗时很长,给这种代码加锁,会极大的降低我们程序的效率。所以提出了读写锁。

注意:写独占,读共享,写锁优先级高

例子:4个读线程,4个写线程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>pthread_rwlock_t rwlock;        //定义读写锁
int counter;void *rrout(void *arg)      //读线程函数
{int t;int i = *(int *)arg;free(arg);while(1){pthread_rwlock_rdlock(&rwlock);printf("read:%d   : %#X : counter= %d\n",i,pthread_self(),counter);pthread_rwlock_unlock(&rwlock);usleep(1111);}
}void *wrout(void *arg)         //写线程函数
{int t;int i = *(int *)arg;free(arg);while(1){t = counter;usleep(1000);pthread_rwlock_rdlock(&rwlock);printf("write:%d   : %#X : counter= %d, ++counter = %d\n",i,pthread_self(),counter,++counter);pthread_rwlock_unlock(&rwlock);usleep(11111);}
}int main()
{int i = 0 ;pthread_t tid[8];pthread_rwlock_init(&rwlock,NULL);        //读写锁初始化for(i = 0; i < 4; i ++){int *p = (int *)malloc(sizeof(int));*p = i;pthread_create(&tid[i],NULL,rrout,(void *)p);}for(i = 0; i < 4; i ++){int *p = (int *)malloc(sizeof(int));*p = i;pthread_create(&tid[i + 4],NULL,wrout,(void *)p);}for(i = 0; i < 8; i++){pthread_join(tid[i],NULL);}pthread_rwlock_destroy(&rwlock);               //销毁读写锁

运行结果:

Linux——读写锁相关推荐

  1. 深度解析Linux读写锁逻辑

    一.Linux为何会引入读写锁? 除了mutex,在linux内核中,还有一个经常用到的睡眠锁就是rw semaphore(后文简称为rwsem),它到底和mutex有什么不同呢?为何会有rw sem ...

  2. linux读写锁 饥饿,读写锁中写锁的饥饿问题

    读写锁是个看上去很美的的抽象 代码是程序员对这个世界的抽象过程,是的,好的代码就像语言,将各个组件之间的关系描述的一清二楚,而读写锁在其中就是一个很好的例子,正如开头的一句引用,这是个看上去很美的抽象 ...

  3. Linux读写锁释放,Linux读写锁的使用

    读写锁是用来解决读者写者问题的,读操作可以共享,写操作是排它的,读可以有多个在读,写只有唯一个在写,写的时候不允许读. 具有强读者同步和强写者同步两种形式: 强读者同步:当写者没有进行写操作时,读者就 ...

  4. Linux多线程的同步------读写锁

    前面介绍过Linux多线程同步的另外两个方法------互斥锁和信号量 Linux多线程的同步-----信号量和互斥锁_神厨小福贵!的博客-CSDN博客 下面来看一下读写锁: 读写锁和互斥锁都带有一个 ...

  5. c程序封装linux,Linux系统使用C语言封装线程读写锁

    在Linux平台上已经有现成的线程读写锁pthread_rwlock_t以及相关API,现将这些API封装成与Win32平台上相同的接口,以便于编写跨平台程序.这些API包括pthread_rwloc ...

  6. Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)

    同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...

  7. linux线程间同步(1)读写锁

    读写锁比mutex有更高的适用性,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁. 1. 当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞: 2 ...

  8. linux 进程 读写锁,linux 下实现高性能读写锁(read/write lock)

    前一篇文章分析了Windows slim read/write lock的工作原理.我们知道它的设计相当精妙,于是我们可以借鉴它的思路来设计linux下的读写锁. 在这个读写锁的设计上,需要注意的是l ...

  9. linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障

    内核同步 内核中可能造成并发的原因: 中断–中断几乎可以在任何时刻异步发生,也就可以随时打断当前正在执行的代码. 软中断和tasklet–内核能在任何时刻唤醒或调度软中断和tasklet,打断当前正在 ...

最新文章

  1. 佳能80d有人脸识别吗_国家地理2020年旅行者最推荐相机Top10,有你喜欢的吗?
  2. Latex使用技巧01:改变数学公式字体的颜色
  3. 2018.12.5 区块链论文翻译
  4. 从“小”培养AI安全意识:OpenAI开源最新强化学习训练工具,安全约束自由定制,开箱即用...
  5. 个人或者企业怎么进行app开发?开发一款APP应用大概须要多少钱?
  6. 朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战
  7. 浏览器无法运行java_window_浏览器无法运行JAVA脚本的解决方法,1、浏览器无法运行JAVA脚本的 - phpStudy...
  8. 怎么清空topic数据_20.Roscpp/Rospy:Topic_demo
  9. oracle定时删库,随手胡乱写的批处理,实现Oracle每天定时备库,DMP文件保留3天,3天后删除,对应2000系统...
  10. html5 “拖放”
  11. 小米高管:已投大量精力研发手机AI芯片,造不造还没定
  12. Windows平台下MySQL常用操作与命令
  13. 签到新旧版本更替问题
  14. linux jdk11 64位下载安装
  15. 毕设题目:Matlab肌电信号
  16. 机械制图之平面图形的尺寸分析
  17. python代码使用dns进行调试_python脚本实现分析dns日志并对受访域名排行
  18. nc63文件服务器,nc命令传输文件
  19. info setup 制作的安装程序 提示卸载程序出现内部错误找不到此版本的卸载程序的utCompiledCode记录
  20. 我的世界服务器信号下面是红,适用于服务器的红石抽奖机我的世界抽奖机电路图...

热门文章

  1. 【转载】eMule电驴使用从入门到精通(8)-------代理和高ID、低ID
  2. 我们的时间都去哪了?
  3. Windows环境下使用Internet Information Service( IIS)管理器上搭建Web资源网站
  4. 网易互动直播2.0 开发 十二 视频设备管理
  5. exe停止运行C语言,处理win7应用程序已停止“异常代码c0000005”的方法
  6. 查看内存大小时解决的单位问题
  7. SMT在生产时,对环境温度的要求有哪些?
  8. 大数据告诉你中老年人上网爱干什么
  9. redis-setnx-实现原理
  10. Redis数据类型——hash