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

时间:2012-01-05 03:15:56

标签: c data-structures concurrent-programming

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

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

以共享哈希表为例,

如果它被实现为多个进程的共享,

该表的所有malloc或同等调用都需要由shmget等替换。

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

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

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

4 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

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

如果你必须(对于进程也是如此),你必须自己开始做。

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

答案 2 :(得分:0)

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

请查看给出here

的各种示例

答案 3 :(得分:0)

您需要使用shmget,并且您需要使用内存屏障来强制执行它们之间的读/写调度。这可以防止编译器和CPU调度软锁等。障碍可以是操作系统和/或特定于拱门,因此如果您发布操作系统,我可以帮助解决这个问题。

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

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