大家都知道,多线程访问同一个资源必须要做同步互斥,一定要用到锁,这个说法是完全正确的吗?

以常见的生产者消费者模型举例,这里我们只有一个生产者,一个消费者。即,一个线程不断的从一个设备读取数据,放入缓冲区buff0,这个是生产者。另一个线程不断从缓冲区buff0取出数据,这个是消费者。

针对上面这种场景,我们设计如下数据结构(环形缓冲区):

#define MAX_LEN 1024struct ring_buf{ char data[MAX_LEN]; int w_pos; int r_pos;};

我们的程序伪代码如下:

生产者:while(1){ int read_length=read(tmpBuf); if(根据w_pos和r_pos的值判断缓冲区剩余空间足够){ copy2ringBuf(ring_buf[w_pos],tmpBuf,read_length); 根据read_length调整w_pos的值; }else 等待消费者线程消耗数据;};消费者:while(1){ int want_length=100; if(根据w_pos和r_pos的值判断缓冲区数据大于100){ readFromRingBuf(tmpBuf,ring_buf[w_pos],want_length); 根据want_length调整r_pos的值; }else 等待生产者创造数据;};

我们看到虽然俩个线程都会访问同一个缓冲区,但是我们并没有使用锁来做互斥,而是使用了俩个变量w_pos及r_pos来做互斥。生产者只会修改w_pos的值,消费者只会修改r_pos的值。完全不需要锁

环形缓冲区示意图

多线程不重复读取数据_别再犯错了,多线程访问同一个资源一定要上锁?相关推荐

  1. 多线程不重复读取数据_用 PHP 实现多线程编程

    (给PHP开发者加星标,提升PHP技能) 转自:腾讯云(枕边书) cloud.tencent.com/developer/article/1012783 1.前言 前些天帮同事查一个问题,第一次接触到 ...

  2. 多线程顺序消费MySQL数据_关于MQ的几件小事(五)如何保证消息按顺序执行

    1.为什么要保证顺序 消息队列中的若干消息如果是对同一个数据进行操作,这些操作具有前后的关系,必须要按前后的顺序执行,否则就会造成数据异常.举例: 比如通过mysql binlog进行两个数据库的数据 ...

  3. python切片读取数据_在Python中读取、切片和重组数据文件blockbyblock

    Fortran程序生成的文本文件包含需要重新格式化的"块"数据(Python脚本).在 此文件中的每个数据"块"对应于块开头指定的"时间". ...

  4. php mysql 重复提交数据_如何真正解决表单重复提交问题php代码

    如何真正解决表单重复提交问题php代码 过去一切时代的精华尽在书中.以下是小编为大家搜索整理的如何真正解决表单重复提交问题php代码,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网! ...

  5. java acr122 读取数据_使用ACR122U 从NTAG203Chip 读取数据

    1.使用NFC Pro(Android APK)读取的TAG信息: 2.连接ACR 122U之后,从设备管理处可以看出ACR122U采用标准的微软CCID和PC/SC驱动(USB CCID): 3.P ...

  6. pandas 按字符串肚脐眼 读取数据_十分钟学习pandas! pandas常用操作总结!

    学习Python, 当然少不了pandas,pandas是python数据科学中的必备工具,熟练使用pandas是从sql boy/girl 跨越到一名优秀的数据分析师傅的必备技能. 这篇pandas ...

  7. python numpy读取数据_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

  8. python从文件中读取数据_【Python】从文件中读取数据

    从文件中读取数据 1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件(文件PI_DESC.txt与file_reader.py在同一目录下) PI_DESC.txt 3.1415926535 ...

  9. java多线程按行读取文件_“java”中多线程按行读取txt且每个线程读的内容不能重复,这么求“demo”?...

    展开全部 你把原来程序中直接读的地62616964757a686964616fe4b893e5b19e31333365646234方,改成调用上面的函数,由该函数统一读行.这样,不管是你有 N 个线程 ...

最新文章

  1. list删除某个元素_Python基础入门之列表(list)
  2. java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...
  3. 多目标跟踪FairMOT笔记
  4. php 入口文件引入取别名,php命名空间别名/导入
  5. mysql 内存占用过多的解决方法
  6. Linux C 算法分析初步
  7. 计算机没有设置无线临时网络,如何创建临时无线网络
  8. 使用 jQuery Mobile 与 HTML5 开发 Web App (十一) —— jQuery Mobile 事件详解
  9. 译文 | 与TensorFlow的第一次接触第二篇:线性回归
  10. 软件实施提升效率的五个工具
  11. 如何 Get 机器学习必备的算法技能? | 技术头条
  12. extjs java 教程_[Java教程]ExtJS 第一个程序
  13. 服务器固态硬盘接口类型,怎么看固态硬盘接口?固态硬盘接口都有哪些类型?...
  14. 局域网组网方案,电信1000M宽带无线WiFi满速方案与排查(随记)
  15. 怎么禁用计算机上的自动播放,如何关闭电脑的自动播放功能
  16. Spring Boot 错误页面解析原理(超级无敌详细)
  17. 用ps魔棒工具选区域和改变区域颜色
  18. 2021全网最全接口测试及常用接口测试工具
  19. 监督学习(supervised learning)与非监督学习(unsupervised learning)
  20. SuperData:2016年VR行业总产值为27亿美元,表现不如预期

热门文章

  1. SpringCloud底层原理
  2. JVM实用参数(三)打印所有XX参数及值
  3. 7个GIF动图帮你瞬间理解三角函数
  4. Unity 3D观察者设计模式-C#委托和事件的运用
  5. 常用排序算法(二)快速排序
  6. C# 生成 MongoDB 中的 ObjectId
  7. sh: react-scripts: command not found after running npm start
  8. WannaCry警示:学会检测和减轻云端恶意内容
  9. windows phone开发第一步:搭建软件开发环境
  10. 解决WORDPRESS评论时头像不显示的问题