我正在使用 shm_open、ftruncate 和 mmap 在共享内存中存储一个动态创建的二维数组。当我对数组进行更新时,更新仅在进行该更新的进程中可见,而没有其他进程使用该共享内存映射。事不宜迟——代码(相关位):
int fd;
int** graph;
fd = shm_open("/graph", O_RDWR|O_CREAT, 0666);
ftruncate(fd, sizeof(int)*numVertices*numVertices);
graph = (int**) mmap(NULL, sizeof(int)*numVertices*numVertices, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
foo(numVertices, fd);
/* Down to function definition */
void foo(int numVertices, int fd) {
int i=0;
for (i; i<num_processes; i++) {
int pid = fork();
if (pid == 0) {
int **graph = (int**) mmap(NULL, sizeof(int)*numVertices*numVertices, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
graph_algorithm(i, numVertices, graph);
}
}
}
void graph_algorithm(int proc_num, int numVertices, int** graph) {
pthread_mutex_lock(&mutex);
if (proc_num == 0) {
graph[0][0] = 1;
}
pthread_mutex_unlock(&mutex);
printf("Process %d: %d\n", proc_num, graph[0][0]);
}
当在 graph_algorithm 中完成打印时,proc_num 为 0 的进程在 graph[0][0] 处为 1,但所有其他进程都保持旧值 0。我省略了 fork 和 mmap 的错误检查——但这就是要点的问题。我还尝试在 graph[0][0] = 1 之后调用 msync(graph, sizeof(int)*numVertices*numVertices, MS_SYNC) 但无济于事。这是我第一次使用共享内存,我不知道我做错了什么。就我所见,这里或任何其他网站都没有出现这个问题。任何帮助是极大的赞赏。