- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多线程读写同一块缓冲区
多线程读写同一块缓冲区SUNNY.MAN 有时候需要超过一个线程来共同读写一个缓冲区,比如不同进程之间的共享数据。大家的做法一般都是开辟一个足够大的缓冲区,并用互斥量来保证数据的准确性和完整性。互斥等待的时间是不可控的,线程越多,越不可控,也就是有时等待的时间长,有时等待的时间短。有没有一个方法能够把这个等待变为一个确定的时间呢,答案当然是肯定的。现在拿数据采集处理来说明这个问题 。假设我们一共两个线程,一个数据采集线程,一个处理线程.我们开辟了一块内存来交换数据。采集线程把采集到的数据顺次写入这个内存,处理线程按一定的时间间隔来取走数据进行处理。当我们能够确保采集线程每秒的开始的20MS写好数据,处理线程每秒开始的第80MS来取走数据,取数据用时20MS,采集线程每秒写一次.那我们不需要任何处理,我们的程序就能工作的好好的。因为这个时序准确而明了.但PC机上一般运行的是多任务的操作系统,我们的线程可能处理时间长,也可能处理时间短,会很抖动.这就有可能发生,数据才写一半的时候,处理线程就取走了数据,这个数据一定是错误的。这时我们用互斥可以解决这个问题 ,所谓互斥就是当写数据时,如果处理线程来处理会发现互斥锁无法打开,它将等待数据写完,然后再取走数据。写数据的线程也一样,当发现处理线程正在读数据,它也需要等待。这样将不可避免的进行时间片的浪费,并且等待时间是不可控的。为了解决这个问题,我在内存中画了一个数据块图。我的做法是分配几倍于所需数据区的缓冲区,然后用一个环形链表来表示数据的写入位置(head)和读取位置(tail),写的线程只移动head,读的线程只移动tail,这样不管什么时序,当设head加1完成后,就可以确保head-1的数据是完整的。当tail+1完成后,就可以知道tail-1的数据块是可用的。并且写数据,移链表的时间是一定的。这个方法仅当一个线程写,一个线程读时可以很好的完成数据的交换,并且确保数据的完整性。但如果有两个线程同时写入数据,要想完成这个就会很困难了。因为写的时候无法确认哪个块正闲着。如下代码If(findfree[current]==0) thenfindfree[current]=1endif就这三行代码就有问题 ,当第一个写线程进入后,判断findfree[current]==0成立后,第二个线程也进行当前判断,发现也空闲,于是也使用这个数据块。现在两个线程都把这次数据写到同一个块中,并且分别tail+1,最后可想而知,两块数据都是错误的。因为无法保证判断占位的操作是原子操作,这个问题似乎不可以解决了,难不成只有用互斥来解决吗。我的想法是根据tid(threaded)来分别分配数据块,这样就可以确保不同的线程 写不同的数据块。应有如下结构Typedef _tagthreadwrite{Pthread_t tid;Int start;Int end;}threadwrite;如此一来我们可以确保写的线程不需要等待在自己的数据块上写入数据。也可以在自己的队列里成功的把新块加入。但问题又出现了,现在有多少个写线程就有多少个数据队列,就有多少个tail,所以读的时候应该读所有的TAIL。应该先取哪个tail呢?最简单的方法我们在写完数据后,一定要把数据的时间同进写到tail中。也就是说以前的队列一个节点是node现在必须是Struct node{Time;Data[]};好了,现在就可以按时间取出应该取走的数据了,并且一定是按写完顺序进行的。As_mhy@163.com.
您可能关注的文档
最近下载
- 2025至2030年中国高透明型香烟包装膜数据监测研究报告.docx
- 2025至2030年中国花岗岩行业市场调查研究及投资前景预测报告.docx
- 齐岳山隧道F断层注浆截水帷幕施工技术.docx VIP
- 《光伏电站运行与维护》试题及答案二.docx VIP
- 三机的配套情况.ppt VIP
- 暑假衔接知识点专题13习作(讲义+试题)三升四年级语文(含答案)部编版.pdf VIP
- _第11课互联网服务应用广 课件+2024—2025学年人教版(2024)初中信息科技七年级全一册.pptx VIP
- 齐岳山隧道F11断层注浆截水帷幕施工技术.doc VIP
- 西师大版三年级下册数学填空题完美版.pdf VIP
- 合同管理审计 - 审计.docx VIP
原创力文档


文档评论(0)