2

我用谷歌搜索了很多共享(并发)数据结构,

所有这些似乎都是为线程共享的,而不是为进程共享的。

以共享哈希表为例,

如果要实现为多个进程共享,

表的所malloc​​有或等效调用都需要替换为shmget等。

但我没有看到这样的例子。

实现多个进程共享的数据结构是否可行?

我没有找到这样的例子这一事实是否意味着它不切实际?

4

4 回答 4

1

主要问题是没有平台无关的方式。因此,假设您在某个 unix 系统上,我可能会mmap在文件上使用任意进程之间的共享。这样做的好处是您可以让任意多个进程共享它,轻松识别共享点(文件),并且您还可以免费获得实际的持久存储(使调试更容易)。你的数据结构有多复杂并不重要——它只是一块内存。因此,您唯一需要解决的问题是如何在您的进程之间同步写入访问 - 这实际上是特定于应用程序的(不过,如果您允许来自多个进程的写入,这并不容易)。

一些示例代码:

#include <sys/mman.h>
#include <fcntl.h>
...
struct my_structure *buf; /* just an example - can be arbitrary complex */
...
int fd = open("foo.bin", O_RDWR);
if (fd == -1) { /* if the file doesn't exist create your initial structure */
  fd = open("foo.bin", O_RDWR | O_CREAT, 0700);
  /* ... allocate enough space in the file or pre-fill with the structure ... */
  /* (for safety you may do that in a separate process or using move-in atomically) */
}
buf = (struct my_structure*) mmap(0, sizeof(*buf), PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);
...
/* memory in buf is now shared across all processes ... */
/* if you want to synchronize that shared memory with the file use msync, but it's not needed for the sharing */
msync(buf, sizeof(*buf), MS_ASYNC);
/* when you're done, unmap */
munmap(buf, sizeof(*buf));
于 2012-01-05T04:28:12.010 回答
0

不要尽可能地实现共享结构,因为这会打开你可能陷入的整个问题领域。

如果您必须这样做(对于流程也是如此),您将不得不自己动手。

但是,如果您可以使用IPC,那可能是最简单的选择。

于 2012-01-05T03:20:45.190 回答
0

您绝对可以与多个进程共享内存(数据结构),并使进程相互通信以使它们在访问共享内存/数据结构时以同步的方式工作。

请浏览此处给出的各种示例

于 2012-01-05T03:22:50.740 回答
0

您需要使用 shmget,并且需要使用内存屏障来强制在它们之间发生读/写调度。这可以防止编译器和 CPU 调度软锁等。障碍可以是操作系统和/或特定于架构的,因此如果您发布您的操作系统,我可能会提供帮助。

所以回答问题,是的,不是的。但...

并发数据结构非常复杂,如果可能的话,我建议尝试将关键部分缩小到足够快的程度,以便可以使用便携式互斥锁对其进行锁定/解锁。

于 2012-01-05T04:03:24.433 回答