Iceoryx(冰羚):无锁队列与并发控制的设计与实现2(源码解析)
接上篇设计3: MpmcLockFreeQueue Multiple Producer Multiple Consumer特点数据存储与索引分离原理当有多个写需要同时写入数据那么写入的位置必定发生竞争。写入数据和更改w指针是两步并且一定是先存入数据再修改w指针不然Reader端就会取到存了一半的脏数据。对于SPSCFifo和SPSCSoFi来说推入数据再更改w指针Reader端看到消息了然后取走。但是当有2个Writer都想写的时候往同一块内存地址推入数据后CAS w指针会导致数据不一致或被覆盖甚至崩溃问题因此将数据和索引分开且需要写完数据后w指针才能被Reader看见。Iceoryx(冰羚)的实现class MpmcLockFreeQueue { MpmcIndexQueue m_freeIndices; // 空闲索引队列初始满0,1,2,...,N-1 MpmcIndexQueue m_usedIndices; // 已用索引队列初始空 ElementType m_buffer[N]; // 数据缓冲区 };push 流程① 从 freeIndices pop 一个空闲索引 → 得到 index5② 往 buffer[5] 写入数据此时没人能看到 index5因为它既不在 free 也不在 used③ 把 index5 push 到 usedIndices数据已经写完了现在才发布pop 流程① 从 usedIndices pop 一个索引 → 得到 index5一定是写完的数据② 读取 buffer[5]③ 把 index5 push 回 freeIndices归还给生产者复用freeIndices 可写的位置池usedIndices 可读的位置池push 从可写池借一个位置 → 写完 → 放进可读池pop 从可读池借一个位置 → 读完 → 放回可写池数据竞争在索引队列上设计4: 索引管理层LoFFLi / CyclicIndex待更新...
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2447799.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!