https://blog.csdn.net/Trouble_provider/article/details/89006234
近期,由于需要将运行度差异较大的三个功能模块,整合到一个系统中,此处不如将三个模块分别记为,它们的关系用图表示如下:
其中,A,B,C三个模块分别运行在200Hz,40Hz和1kHz的频率上,且它们之间的数据流动方向是单向数据流动,即不存在两个并行模块同时往一个缓存Buffer里面写的情况,也就是说,没有写入竞争的情况发生。
本来以为只要没有这种写入竞争的可能,上图的解决方式便可以使得这三个模块很好的并行运行了,事实证明还是too naive...
总之:只要你写入Buffer的数据并不能保证总是最终结果,也就是说写入缓冲Buffer中可能存在中间结果,那么上述方式就有可能会导致读方线程读缓冲区时读到“脏数据”——中间结果。
类似于图形学中显示模式的双缓冲机制,采取双缓冲可以解决这个问题,即:
- 一个缓冲区为写缓冲区,Write Buffer,其中可以存放“中间结果“;
- 另一个缓冲区为读缓冲区,Read Buffer,只有最终结果才会被写入这个缓冲区。
改进的系统各模块组织形式如下图:
如此组织,便可以保证Read Buffer里面存放的始终是最终结果,也就避免了读到“毫无意义”的“脏数据”中间结果了。
之前单缓冲区的实现,读方线程经常会读到一些莫名其妙的中间数据,产生不正确的输出,这么一改之后,就不会有这种现象了。
目前并行化过程中踩到的坑就是这个了,如果还有其他的,再来更新~
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"> <use xlink:href="#csdnc-thumbsup"></use> </svg><span class="name">点赞</span> <span class="count"></span> </a></li> <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true"> <use xlink:href="#icon-csdnc-Collection-G"></use> </svg><span class="name">收藏</span></a></li> <li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{"mod":"1582594662_002"}"><svg class="icon" aria-hidden="true"> <use xlink:href="#icon-csdnc-fenxiang"></use> </svg>分享</a></li> <!--打赏开始--> <!--打赏结束--> <li class="tool-item tool-more"> <a> <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg> </a> <ul class="more-box"> <li class="item"><a class="article-report">文章举报</a></li> </ul> </li> </ul> </div> </div> <div class="person-messagebox"> <div class="left-message"><a href="https://blog.csdn.net/Trouble_provider"> <img src="https://profile.csdnimg.cn/6/B/A/3_trouble_provider" class="avatar_pic" username="Trouble_provider"> <img src="https://g.csdnimg.cn/static/user-reg-year/2x/3.png" class="user-years"> </a></div> <div class="middle-message"> <div class="title"><span class="tit"><a href="https://blog.csdn.net/Trouble_provider" data-report-click="{"mod":"popu_379"}" target="_blank">Trouble_provider</a></span> </div> <div class="text"><span>发布了18 篇原创文章</span> · <span>获赞 19</span> · <span>访问量 2万+</span></div> </div> <div class="right-message"> <a href="https://im.csdn.net/im/main.html?userName=Trouble_provider" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信 </a> <a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379"}">关注</a> </div> </div> </div>