我搜索了很多共享(并发)数据结构,
所有这些似乎都是为线程共享的,而不是为进程共享。
以共享哈希表为例,
如果它被实现为多个进程的共享,
该表的所有malloc
或同等调用都需要由shmget
等替换。
但我没有看到这样的例子。
实现多个进程共享的数据结构是否切实可行?
我没有找到这样一个例子的事实是否意味着它不切实际?
答案 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)
答案 2 :(得分:0)
您绝对可以与多个进程共享内存(数据结构),并使进程相互通信,以便在访问共享内存/数据结构时以同步方式工作。
请查看给出here
的各种示例答案 3 :(得分:0)
您需要使用shmget,并且您需要使用内存屏障来强制执行它们之间的读/写调度。这可以防止编译器和CPU调度软锁等。障碍可以是操作系统和/或特定于拱门,因此如果您发布操作系统,我可以帮助解决这个问题。
所以回答问题,是的,没有。但...
并发数据结构非常复杂,如果可能的话,我建议尝试将关键部分缩小到足够快的速度,以便可以使用便携式互斥锁锁定/解锁。