控制进程内存储的顺序

问题描述

我正在尝试使用共享内存中的缓冲区解决发布者订阅者问题。我的发布者使用 C++ 中的 memcpy() 从一个偏移量(从缓冲区的开始)在缓冲区中写入一条消息,在它写入消息后,它将这个偏移量存储在共享内存的另一个段中,在那里它写了最后一条消息。订阅者使用此偏移量来确定发布者成功写入最后一条消息的位置。问题是我需要控制存储顺序,即发布者首先将消息成功存储在缓冲区中,然后更新其偏移量。同样,在订阅者方面,我需要消费者首先成功读取一条消息,然后更新有关他们刚刚读取最后一条消息的位置的信息。我可以想到在这里使用内存屏障,但无法实现。

解决方法

我认为您将内存屏障与锁混淆了。通常生产者/消费者模式是使用某种形式的锁定来实现的。

当您有多个进程时,通常也会使用术语“共享内存”,因为所有内存都在同一个进程中“共享”。

您可以在此处找到有关该模式的更多信息:https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem 以及有关不同类型锁定之间差异的更多信息在这里: difference between lock,memory barrier,semaphore

这是一个复杂的问题,需要经验才能正确解决。如果您想学习,请继续进行实施,但请注意,它不会很快投入生产。例如,使用 std::memcpy 复制数据非常限制您生成/使用的数据类型,因为大多数 C++ 类型不能仅使用 std::memcpy 复制。要知道使用 std::memcpy 复制类型是否安全,您可以使用 https://en.cppreference.com/w/cpp/types/is_trivially_copyable