C++ 对共享资源的容错读写器访问

C++ 对共享资源的容错读写器访问,c++,multithreading,synchronization,locking,lock-free,C++,Multithreading,Synchronization,Locking,Lock Free,我目前正在原型化一个应用程序,它在共享内存中维护一个共享资源,并且可以由一个编写器通过多个读卡器(通常为4个)进行更新。读者和作者作为一个独立的过程运行。作者更新共享内存的频率要比读者从中读取的频率高得多 共享资源是一个结构数组,每个结构都有一个锁来保护对它的访问。写入操作获取锁并写入元素[i]的最新值,然后释放锁 struct Data { int a; int b; char[10]; c Lock l; }; struct Data elements[ 10000 ];

我目前正在原型化一个应用程序,它在共享内存中维护一个共享资源,并且可以由一个编写器通过多个读卡器(通常为4个)进行更新。读者和作者作为一个独立的过程运行。作者更新共享内存的频率要比读者从中读取的频率高得多

共享资源是一个结构数组,每个结构都有一个锁来保护对它的访问。写入操作获取锁并写入元素[i]的最新值,然后释放锁

struct Data
{
  int a;
  int b;
  char[10]; c
  Lock l;
};

struct Data elements[ 10000 ];
我面临着以下挑战

1) 锁l的开销应该最小。 2) 因为我们有很多读者,我正在寻找一些读者-作者语义学的东西。 3) 如果其中一个进程崩溃,则应优雅地释放锁

有人能指出一些关于这些的文献吗?如果您能分享您在解决类似挑战方面的经验,将不胜感激

我将在C++中实现解决方案


谢谢。

这会有点痛。如果一个进程在持有写锁时退出,您可以通过为每个进程使用一个单独的魔法值(可能基于PID)来处理这个问题。但是如果一个进程在持有多个读锁中的一个时退出?你必须释放正确的号码。可能最好使用操作系统提供的内核支持的锁,而不是通过共享内存中的互锁操作滚动自己的锁。你看到了吗:man pthread_rwlock_rdlock对我来说有两个不清楚的问题:1。是否需要验证读取并执行读取锁定?如果您使用的是共享内存,那么可以在Linux中使用shmem_ctl(SHM_LOCK/SHM_UNLOCK)。2.它是独立于平台的解决方案吗?如果是的话,您需要包装类来隐藏实现细节。