单生产者多消费者获取最新数据的通用数据结构名称咨询
单生产者多消费者的多缓冲状态传递结构:名称与实现
问题背景
该数据结构的核心行为逻辑如下:
- 需要N个插槽,N的取值为消费者数量加2
- 生产者锁定一个未被消费者占用且非最新已写入的插槽执行写入操作
- 写入完成后,生产者解锁该插槽并将其标记为「最新已写入插槽」
- 消费者锁定最新已写入插槽进行读取(同步增加锁定计数)
- 读取完成后,消费者减少锁定计数
在单生产者单消费者场景下,该结构被称为三重缓冲(Triple buffering),但现有技术讨论多聚焦于视频缓冲、图形硬件、帧率控制等场景,未覆盖多消费者的适配情况。现希望将该思路应用于「单线程向多线程传递最新设置/状态结构」的场景,需明确两个问题:这类结构是否有通用名称?若无通用名称,主流开发库中是否有对应实现?
回答
通用名称
目前计算机科学领域并没有针对这种单生产者-多消费者、基于引用计数锁定的多缓冲数据传递结构的广泛认可的专属通用名称。你可以采用以下描述性名称来指代它:
- 多消费者适配的三重缓冲变体:突出其源于三重缓冲的设计思路
- 单生产者多消费者版本化缓冲池:精准传达核心特性——单生产者写入、多消费者读取最新版本、基于缓冲池+引用计数的资源管理
主流库中的实现参考
虽然没有完全匹配的开箱即用组件,但主流并发开发库提供了可复用的基础组件,能快速搭建这类结构:
- C++ 生态
- 基于
std::atomic实现最新插槽标记、锁定计数的原子操作,搭配std::vector作为插槽缓冲池,即可构建核心逻辑。 - 第三方库如Abseil的
absl::Mutex配合版本化数据结构,或Folly的folly::ProducerConsumerQueue的定制变体,可作为更封装化的实现参考。
- 基于
- Java 生态
- 利用
AtomicReference指向最新状态实例,结合AtomicInteger维护每个实例的引用计数,搭配CopyOnWriteArrayList作为缓冲池,可实现类似逻辑。 - Guava库中的
LoadingCache或ListenableFuture相关工具,可辅助构建带引用计数的状态分发机制。
- 利用
- Go 语言生态
- 使用
atomic.Value存储最新状态副本,配合自定义原子引用计数操作或sync.WaitGroup,搭配切片作为缓冲池,能快速实现该结构。
- 使用
这类结构的核心设计目标是让消费者始终能获取最新的已写入数据,同时保证生产者有空闲插槽可进行写入操作,本质是版本化数据的并发安全分发,核心依赖原子操作实现轻量的状态同步与资源管理。
内容的提问来源于stack exchange,提问作者jhnlmn
相关产品推荐
相关产品推荐

