提问人:Ku-hello 提问时间:10/10/2023 更新时间:10/10/2023 访问量:25
GCD 信号量在使用共享内存的 IPC 中不起作用
GCD Semaphore not working in IPC using shared memory
问:
我正在尝试使用一些共享内存建立 IPC。我使用 GCD 的信号量来访问内存。这是我遇到的问题的最小再现:
/* A simple readers/writers program using a one-word shared memory. */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <dispatch/dispatch.h>
dispatch_semaphore_t* mutex;
int main (void){
mutex = (dispatch_semaphore_t*)mmap(0, sizeof(dispatch_semaphore_t)*2, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
if(mutex == MAP_FAILED){
printf("Error while mapping");
exit(1);
}
*mutex = dispatch_semaphore_create(1);
*(mutex+1) = dispatch_semaphore_create(0);
pid_t pid;
if((pid = fork()) < 0){
printf("Error while creating child process\n");
exit(1);
}
if(pid){
printf("Parent started\n");
dispatch_semaphore_wait(*mutex, DISPATCH_TIME_FOREVER);
printf("Parent in crit section\n");
// Crit
printf("Parent exiting crit section\n");
dispatch_semaphore_signal(*(mutex+1));
wait(NULL);
}
else{
printf("Child started\n");
dispatch_semaphore_wait(*(mutex+1), DISPATCH_TIME_FOREVER);
printf("Child in crit section\n");
// Crit
printf("Child exiting crit section\n");
dispatch_semaphore_signal(*mutex);
exit(0);
}
}
我期望的输出是父项将首先进入和退出关键部分,而子项将跟随。但这是我得到的输出:
Parent started
Parent in crit section
Parent exiting crit section
Child started
子进程一直在等待。显然,父进程似乎不起作用。
我找到了使用存储在 IPC 共享内存中的 POSIX 信号量的答案,但我找不到如何为 GCD 的调度信号量执行此操作。dispatch_semaphore_signal()
有人可以解释为什么会发生这种情况以及我如何解决这个问题吗?请建议使用 GCD 的调度信号量而不是 POSIX 的命名或未命名信号量的解决方案。谢谢。
答: 暂无答案
评论