与进程使用互斥/信号量

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

我想写这样的代码:

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(); } } 
  • 有人可以指向类似的代码吗?
  • 我知道不同的进程有不同的地址空间,但是我不知道上面是不是地址空间,但是,互斥量是不是指向同一个内核对象呢?

对的,这是可能的。 有很多方法来同步不同的进程。 也许这个领域中最受欢迎的互斥方案是共享内存上的System V IPC信号量和原子操作 。 我建议你阅读David Ruslin所着的“ 进程间通信机制”一书的第5章,或者更好的是阅读整本书。

至于第二个问题,商品硬件上的大多数现代操作系统会将进程置于不同的地址空间,尽管进程也可能共享相同的地址空间(参见虚拟内存 , 内存保护 )。 无论哪种方式,如果IPC机制由内核处理,那么两个进程将会引用相同的“内核对象”,就像你说的那样。 在没有内核的情况下(几乎)实现互斥(就像使用“共享内存”的某种类型的旋转锁),两个进程都会引用相同的物理内存,即使这些内存的虚拟地址可能不同。

希望能帮助到你。 祝你好运!

要明确的是,POSIX(和linux)支持两个不同的信号族,它们有两个不同的接口和使用方法。

有更老的SysV信号量由semgetsemopsemctl和(可选) ftok

更现代的“posix”信号由sem_open/sem_initsem_waitsem_postsem_closesem_unlink

设置/使用制度和功能是不同的,所以值得熟悉这两者,看看什么是更好的使用情况。

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

听起来就像你正在寻找系统V IPC你可能会使用信号量进程之间的同步。

以下是Linux中Sys V IPC的一个很好的介绍

你会想要命名互斥/信号的。 看看这个StackOverflow答案 ,描述了一些观点。 这是一个描述使用pthread_mutexattr_setname_np的IBM 。 需要注意的一点是,在Linux中命名互斥体不是100%可移植的(也就是说它可能在Ubuntu上运行,但不在CentOS上运行等等),所以你需要确保你的平台支持它。 如果你的系统上没有可用的互斥锁,你可以使用带有一些等待条件的命名管道,甚至是本地套接字。 另一个答案指出是SysV IPC。

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