将字(32/64位)写入字符数组的原子性



我目前正在构建一个新的数据结构,我将使用它作为一个具有单个生产者和单个消费者的循环数组/哈希映射。

该结构是一个以"bucket"分隔的char数组(比如一个1024字节的数组,拆分为4个256字节的bucket),我想在其中存储永远不大于bucket大小的二进制数据。

我希望写入程序基本上永远不会阻止写入(并在缓冲区满时覆盖最后一个条目),读者能够跳到特定的存储桶编号并读取"一致"(不需要是最新的)条目。

我对并发控制的想法是使用一种seqlock。虽然我可以为结构设置一个全局seqlock,但我希望通过每个"bucket"设置一个来避免缓存线争用。因此,对于写入数组,我想做的是(seqlock的想法):

  1. 以不断增加的序列号写入bucket的前4/8字节
  2. 获取障碍
  3. 写入bucket的其余数据
  4. 释放屏障
  5. 以不断增加的序列号写入bucket的前4/8字节

基本上,bucket的开头被用作seqlock序列号。

现在我关心的是步骤1和4的原子性。如果我memcpy(char*)&序列进入缓冲区?它是原子弹吗(我猜不是)?有没有一种方法可以使其原子化(例如,通过正确对齐"桶")?

嗯,我对写入char数组的一般情况感兴趣,但我想绕过这个问题的最简单方法是使用一个包含序列和char[maxSize]的bucket结构。

相关内容

  • 没有找到相关文章

最新更新