Caching 为什么这种循环缓冲区设计不需要任何同步?

Caching 为什么这种循环缓冲区设计不需要任何同步?,caching,concurrency,shared-memory,circular-buffer,thread-synchronization,Caching,Concurrency,Shared Memory,Circular Buffer,Thread Synchronization,在“困难->始终保持一个插槽打开”一节中,作者没有提到线程之间同步的任何要求: 始终打开一个插槽 此设计始终保持一个插槽未分配。一个完整的缓冲区最多有(大小为1)个插槽。如果两个指针引用同一个插槽,则缓冲区为空。如果结束(写入)指针指向开始(读取)指针指向的插槽之前的插槽,则缓冲区已满 优点是: 该解决方案简单而健壮 缺点是: 一个插槽丢失,因此当缓冲区大小为小>或插槽较大或在硬件中实现时,这是一个不好的折衷方案 完整测试需要模运算blockquote 为什么没有这样的要求?执行顺序应为

在“困难->始终保持一个插槽打开”一节中,作者没有提到线程之间同步的任何要求:

始终打开一个插槽

此设计始终保持一个插槽未分配。一个完整的缓冲区最多有(大小为1)个插槽。如果两个指针引用同一个插槽,则缓冲区为空。如果结束(写入)指针指向开始(读取)指针指向的插槽之前的插槽,则缓冲区已满

优点是:

  • 该解决方案简单而健壮
缺点是:

  • 一个插槽丢失,因此当缓冲区大小为小>或插槽较大或在硬件中实现时,这是一个不好的折衷方案
  • 完整测试需要模运算blockquote
为什么没有这样的要求?执行顺序应为:

  • 插入新数据

  • 增加写入索引


  • 但是,如果编译器将顺序颠倒为优化,该怎么办?

    对于此类线程问题,本文的大部分内容都相当中立,不确定您为什么只关注一个模型——事实上,在某些情况下,循环缓冲区可能仅由一个线程使用,因此当然不存在线程问题。这是多核系统上两个公司通信通道(使用共享内存)之间通信所需的方法。如果您阅读了其他选项,作者会提到当多线程使用它时该怎么做。这些选项都没有讨论线程安全所需的内存屏障或写入顺序。有两个地方提到了同步,但这是在多个编写器对同一个变量的上下文中提到的。简而言之,是的,你需要考虑线程安全性,如果你正在执行这些选项中的任何一个,那就超出了页面上提到的内容。