双缓冲同步问题,请教高手 !

wangqinfeng 2011-03-03 10:52:17
情况:声明了两个vector<>对象,有两个线程一个线程用于向vector写入数据,另一个线程读取,读取线程可能会占用较长时间,但写入线程又不允许阻塞
请问:用着两个vector缓冲区,如何实现 或者 是否有其他更好办法
谢谢
...全文
137 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-03-03
  • 打赏
  • 举报
回复
http://www.cppblog.com/deane/articles/113983.html


方法很好,顺便学习了,这是原文Blog.

第二种方法效率更高,毕竟第一种还是避免不了锁的情况,只是每次读线程队列空时,可以一次性批量获取大量的可读数据,在今后的一段时间内能够避免锁的影响.

第二种方法需要对读线程做休眠处理,否则CPU占用率太高,检测i<j是否成立,如果成立则可以开始读i桶,否则Sleep一段时间后再做检测.
qq120848369 2011-03-03
  • 打赏
  • 举报
回复

两个队列,一个给逻辑线程读,一个给IO线程用来写,当逻辑线程读完队列后会将自己的队列与IO线程的队列相调换。
IO线程每次写队列时都要加锁,逻辑线程在调换队列时也需要加锁,但逻辑线程在读队列时是不需要加锁的.


读线程发现读队列空,则加锁并把写线程里的数据全部取到,否则不加锁进行读,此时读写同步(这里就高效了).
写线程始终加锁进行写数据到写队列,此锁与读线程数据请求互锁,保证数据安全完整.

提供一个队列容器,里面有多个队列,每个队列都可固定存放一定数量的消息。网络IO线程要给逻辑线程投递消息时,会从队列容器中取一个空队列来使用,直到将该队列填满后再放回容器中换另一个空队列。而逻辑线程取消息时是从队列容器中取一个有消息的队列来读取,处理完后清空队列再放回到容器中。

这样便使得只有在对队列容器进行操作时才需要加锁,而IO线程和逻辑线程在操作自己当前使用的队列时都不需要加锁,所以锁竞争的机会大大减少了。

这里为每个队列设了个最大消息数,看来好像是打算只有当IO线程写满队列时才会将其放回到容器中换另一个队列。那这样有时也会出现IO线程未写满一个队列,而逻辑线程又没有数据可处理的情况,特别是当数据量很少时可能会很容易出现[这个可以通过设置超时来处理, 如果当前时间-向队列放入第一个包的时间 > 50 ms, 就将其放回到容器中换另一个队列]。



读写线程均不加锁,读写线程初始桶下标i=j=0,写线程每次写满一个桶之后将j+=1,而读线程一旦检测到i<j,则可以开始读取i桶中的数据,所以不需要锁,但会因为数据到来的太慢,造成读线程等待时间过久的情况,可以设置一个超时时间,超时了则让写线程j+=1,此时读线程可以开始读.

wangqinfeng 2011-03-03
  • 打赏
  • 举报
回复
同步时 需要解决一个问题 :读取时会操作数据库,因此时间比较长或许,这样就会严重影响写入操作
quwei197874 2011-03-03
  • 打赏
  • 举报
回复
同步一下吧!
wangqinfeng 2011-03-03
  • 打赏
  • 举报
回复
TO wshk_xl:如何取出包,又归还包,包具体是个什么概念 思想能懂 具体操作不明白
wshk_xl 2011-03-03
  • 打赏
  • 举报
回复
我认为要想满足 写入不中断的话 可以使用 两个缓冲池, 写入的时候从第一个池中取出一个包, 写完之后放入另外一个池中。 读操作就从第二个池中取包, 读取完之后将包归还给第一个池。 根据读写速度的差异,适当调整缓冲池中包的总个数,就可以了。
wangqinfeng 2011-03-03
  • 打赏
  • 举报
回复
不用也可以,主要的得解决 “写入不中断” 的问题
恨天低 2011-03-03
  • 打赏
  • 举报
回复
不太明白,LZ为什么要用双缓冲呢??
wangqinfeng 2011-03-03
  • 打赏
  • 举报
回复
今天 在等待一天 看有没有其他解答 明天结贴
wangqinfeng 2011-03-03
  • 打赏
  • 举报
回复
TO qq120848369:这确实是我想要的东西 ,嘎嘎

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧