我目前正在构建一个新的数据结构,我将使用它作为一个具有单个生产者和单个消费者的循环数组/哈希映射。
该结构是一个以"bucket"分隔的char数组(比如一个1024字节的数组,拆分为4个256字节的bucket),我想在其中存储永远不大于bucket大小的二进制数据。
我希望写入程序基本上永远不会阻止写入(并在缓冲区满时覆盖最后一个条目),读者能够跳到特定的存储桶编号并读取"一致"(不需要是最新的)条目。
我对并发控制的想法是使用一种seqlock。虽然我可以为结构设置一个全局seqlock,但我希望通过每个"bucket"设置一个来避免缓存线争用。因此,对于写入数组,我想做的是(seqlock的想法):
- 以不断增加的序列号写入bucket的前4/8字节
- 获取障碍
- 写入bucket的其余数据
- 释放屏障
- 以不断增加的序列号写入bucket的前4/8字节
基本上,bucket的开头被用作seqlock序列号。
现在我关心的是步骤1和4的原子性。如果我memcpy(char*)&序列进入缓冲区?它是原子弹吗(我猜不是)?有没有一种方法可以使其原子化(例如,通过正确对齐"桶")?
嗯,我对写入char数组的一般情况感兴趣,但我想绕过这个问题的最简单方法是使用一个包含序列和char[maxSize]的bucket结构。