我正在寻找在偏向编写器读取器/编写器模型中的两个(或多个)进程之间有效共享数据 block 的最佳方法。
我当前的测试是使用 boost::interprocess
。我已经创建了一些 managed_shared_memory
并试图通过使用存储在共享内存中的进程间互斥来锁定对数据 block 的访问。
但是,即使在读取器上使用 sharable_lock
并在写入器上使用 upgradable_lock
时,客户端在写入操作期间将读取碎片值而不是阻塞。在单个进程中的线程之间进行类似的读写器设置时,我使用 upgrade_to_unique_lock
来解决这个问题。但是,我还没有找到它的 boost::interprocess
等价物。有吗?
服务器(编写器):
while (1) {
// Get upgrade lock on the mutex
upgradable_lock <MutexType> lock(myMutex);
// Need 'upgrade_to_unique_lock' here so shared readers will block until
// write operation is finished.
// Write values here
}
客户端(读者)
while (1)
{
// Get shared access
sharable_lock <MutexType> lock(myMutex);
// Read p1's data here -- occasionally invalid!
}
我想手头更大的问题是:进程间互斥体是否是在偏向编写器的设置中访问进程间共享内存的正确方法?
注意:使用 Boost 1.44.0
最佳答案
所有 Boost.Interprocess 可升级锁都支持根据 this 升级.定义 here .
关于您的更广泛的问题 - 我认为这正是您想要的。读者仍然可以并发工作,你必须防止并发写入。除非您可以对共享内存进行分区以保证更受限的访问,否则这看起来是最好的。
关于c++ - 是否有用于 boost::interprocess 的 'upgrade_to_unique_lock'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4157491/