



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多线程读写同一块缓冲区SUNNY.MAN 有时候需要超过一个线程来共同读写一个缓冲区,比如不同进程之间的共享数据。大家的做法一般都是开辟一个足够大的缓冲区,并用互斥量来保证数据的准确性和完整性。互斥等待的时间是不可控的,线程越多,越不可控,也就是有时等待的时间长,有时等待的时间短。有没有一个方法能够把这个等待变为一个确定的时间呢,答案当然是肯定的。现在拿数据采集处理来说明这个问题 。假设我们一共两个线程,一个数据采集线程,一个处理线程.我们开辟了一块内存来交换数据。采集线程把采集到的数据顺次写入这个内存,处理线程按一定的时间间隔来取走数据进行处理。当我们能够确保采集线程每秒的开始的20MS写好数据,处理线程每秒开始的第80MS来取走数据,取数据用时20MS,采集线程每秒写一次.那我们不需要任何处理,我们的程序就能工作的好好的。因为这个时序准确而明了.但PC机上一般运行的是多任务的操作系统,我们的线程可能处理时间长,也可能处理时间短,会很抖动.这就有可能发生,数据才写一半的时候,处理线程就取走了数据,这个数据一定是错误的。这时我们用互斥可以解决这个问题 ,所谓互斥就是当写数据时,如果处理线程来处理会发现互斥锁无法打开,它将等待数据写完,然后再取走数据。写数据的线程也一样,当发现处理线程正在读数据,它也需要等待。这样将不可避免的进行时间片的浪费,并且等待时间是不可控的。为了解决这个问题,我在内存中画了一个数据块图。我的做法是分配几倍于所需数据区的缓冲区,然后用一个环形链表来表示数据的写入位置(head)和读取位置(tail),写的线程只移动head,读的线程只移动tail,这样不管什么时序,当设head加1完成后,就可以确保head-1的数据是完整的。当tail+1完成后,就可以知道tail-1的数据块是可用的。并且写数据,移链表的时间是一定的。这个方法仅当一个线程写,一个线程读时可以很好的完成数据的交换,并且确保数据的完整性。但如果有两个线程同时写入数据,要想完成这个就会很困难了。因为写的时候无法确认哪个块正闲着。如下代码If(findfreecurrent=0) thenfindfreecurrent=1endif就这三行代码就有问题 ,当第一个写线程进入后,判断findfreecurrent=0成立后,第二个线程也进行当前判断,发现也空闲,于是也使用这个数据块。现在两个线程都把这次数据写到同一个块中,并且分别tail+1,最后可想而知,两块数据都是错误的。因为无法保证判断占位的操作是原子操作,这个问题似乎不可以解决了,难不成只有用互斥来解决吗。我的想法是根据tid(threaded)来分别分配数据块,这样就可以确保不同的线程 写不同的数据块。应有如下结构Typedef _tagthreadwritePthread_t tid;Int start;Int end;threadwrite;如此一来我们可以确保写的线程不需要等待在自己的数据块上写入数据。也可以在自己的队列里成功的把新块加入。但问题又出现了,现在有多少个写线程就有多少个数据队列,就有多少个tail,所以读的时候应该读所有的TAIL。应该先取哪个tail呢?最简单的方法我们在写完数据后,一定要把数据的时间同进写到tail中。也就是说以前的队列一个节点是node现在必
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石磨板施工方案(3篇)
- 女神节插花活动策划方案(3篇)
- 活动过程管理策划方案(3篇)
- 长治人证考试题库及答案
- 校园保安测试题目及答案
- 一年级小学生写国庆节的作文(7篇)
- 读流氓兔的故事350字13篇范文
- 四季景色描绘技巧与鉴赏教案
- 时间段与时刻的区别
- 以磨炼为话题的中考作文范文素材13篇
- 失眠的预防与中医护理
- 2025-2030年中国再生建筑骨料行业市场现状供需分析及投资评估规划分析研究报告
- 2025至2030年中国紫外线LED行业发展现状及发展趋势预测报告
- 2025年+贵州省中考英语核心高频690词+++
- 2025届中考物理全真模拟卷【云南专用】(含解析)
- 大型医院食堂管理制度
- DB62T 4248-2020 青海云杉育苗技术规程
- T/YNIA 003.1-2021面膜护肤用非织造布第1部分:水刺法
- 2025年家庭教育指导考试试卷及答案总结
- 军队文职管理学备考指南
- 胖东来考试试题及答案
评论
0/150
提交评论