GCD 信号量在使用共享内存的 IPC 中不起作用

GCD Semaphore not working in IPC using shared memory

提问人:Ku-hello 提问时间:10/10/2023 更新时间:10/10/2023 访问量:25

问:

我正在尝试使用一些共享内存建立 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 的命名或未命名信号量的解决方案。谢谢。

C IPC 信号量 mMAP

评论

0赞 stark 10/10/2023
如果您使用的是 GCD,为什么使用 fork 而不是 DispatchWorkItem?

答: 暂无答案