C-要创建多少个信号量



我知道信号量用于同步进程以访问共享内存。

基本上我不明白要创建多少个信号量?

假设,我只有一个共享内存的一部分,两个过程将访问它。然后,仅创建一个信号量。

但是,如果我有三个或多个过程可以访问相同的共享内存,那么它需要更多的信号量集吗?

信号量集创建的条件是什么?

预先感谢。

如果您使用的是SEMCTL(IPC信号),则需要创建一个信号量。如果您使用的是POSIX信号量(SEM_INIT),则只有一个,但前提

可以通过线程或进程共享信号量。跨过程共享在操作系统级别上实施。即使不是通过分配单亲过程创建这些过程,两个或更多不同的过程也可以共享相同的信号量。

两种类型的信号量是SYSV和POSIX。查找有关DEFFERENCE的更多信息,请到达系统V IPC vs posix ipc

sysv信号量保留在内核中,因此您无需为它们分配空间或将它们放在共享内存中以共享它们。但是,您确实需要使用它们找到它们的每个过程的方法。

请参阅此示例,以共享父进程与其孩子之间的未命名的UNIX信号(要使用GCC编译,您需要-pthread标志):

#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(void)
{
  /* place semaphore in shared memory */
  sem_t *sema = mmap(NULL, sizeof(sema), 
      PROT_READ |PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,
      -1, 0);
  if (sema == MAP_FAILED) {
    perror("mmap");
    exit(EXIT_FAILURE);
  }
  /* create/initialize semaphore */
  if ( sem_init(sema, 1, 0) < 0) {
    perror("sem_init");
    exit(EXIT_FAILURE);
  }
  int nloop=10;
  int pid = fork();
  if (pid < 0) {
    perror("fork");
    exit(EXIT_FAILURE);
  }
  if (pid == 0) { 
    /* child process*/

看一下Pearce Wiki http://www.andy-pearce.com/wiki/notes/notes/sharing_pthreads_primitives_betimitives_between_processes有一个pthreads mutex和条件变量放在共享内存中而是信号量。您可以将此解决方案扩展到两个以上的过程。

它不取决于访问资源的过程数量。信号量用于避免同时访问资源。如果您只有一个资源以一种资源初始化信号量。一旦一个流程获取资源,其他两个或多个过程等待释放资源。一旦根据流程状态/调度释放资源,另一个过程之一将获取资源。

序列将就像

init具有一个资源:sem_init()

获得了资源:sem_wait()或sem_timedwait()

免费资源:sem_post()

最新更新