在进程中使用互斥体/信号量

问题描述 投票:0回答:5

到目前为止,我在网上阅读的几乎所有代码和教程都涉及使用互斥体和信号量在线程之间进行同步。它们可以用于进程之间的同步吗?

我想编写如下所示的代码:

void compute_and_print() {
   // acquire mutex
   // critical section
   // release mutex
}

void main() {
int pid = fork();
if ( pid == 0 ) {
  // do something
  compute_and_print();
}
else {
  // do something
  compute_and_print();
}
}
  • 有人可以向我指出执行此操作的类似代码吗?
  • 我知道不同的进程有不同的地址空间,但我想知道上面是否会是不同的地址空间,但是,互斥锁不会引用同一个内核对象吗?
linux process ipc mutex
5个回答

2
投票
独立的信号量系列,它们具有两种不同的接口和使用方法。

较旧的 SysV 信号量由 semget

semop

semctl
 和(有些可选)
ftok
 组成。
更现代的“posix”信号量由 
sem_open/sem_init

sem_wait

sem_post
sem_close
sem_unlink
 组成。
设置/使用机制和功能非常不同,值得您熟悉两者,看看哪种更适合您的用例。

您还可以使用 pthreads 包中的进程共享互斥体。

听起来您正在寻找

1
投票
您可能会使用信号量在进程之间进行同步。

这是对 Linux 中的 Sys V IPC 的精彩介绍

您需要命名互斥体/信号量。看看

1
投票
,它描述了一些要点。这是描述

pthread_mutexattr_setname_np 使用的 IBM。需要注意的一件事是,Linux 中的命名互斥体不是 100% 可移植的(即它可能在 Ubuntu 上工作,但不能在 CentOS 等上工作),因此您需要确保您的平台支持它。如果命名互斥体在您的系统上不可用,您可以使用带有一些等待条件的命名管道,甚至本地套接字。正如另一个答案指出的那样,是 SysV IPC。

您首先需要回答的最大问题是您希望您的应用程序如何“跨 Linux 平台”兼容。

互斥体是 pthreads 库的一部分。用户程序通过定义 pthread_mutex_t 类型的全局变量并初始化它来创建互斥对象。例如,

0
投票
pthread_mutex_t new_mutex = PTHREAD_MUTEX_INITIALIZER;

这里,new_mutex仅在定义它的程序中可见。因此new_mutex可以用来同步运行该程序的进程中的线程。
当需要同步进程时,情况略有不同。每个进程都有单独的地址空间,进程中的变量是该进程的本地变量,不能从另一个进程访问。因此,为了同步多个进程,需要使用内核提供的信号量对象。例如,

sem_t *sem_open (const char *name, int oflag);

sem_open 系统调用返回一个指向信号量对象的指针,基于
name
。希望同步的两个进程可以使用相同的

name通过内核访问信号量。 获取指向同一信号量的指针后,进程可以使用 sem_wait

sem_post 系统调用进行同步。

© www.soinside.com 2019 - 2024. All rights reserved.