到目前为止,我在线阅读的几乎所有代码和教程都涉及使用互斥锁和信号量来实现线程之间的同步。它们可以用于在进程之间进行同步吗?
我想编写如下代码:
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();
}
}
答案 0 :(得分:2)
是的,有可能。有许多方法可以同步不同的进程。也许这个领域中最受欢迎的互斥解决方案是System V IPC semaphores和atomic operations shared memory。我建议你阅读David A Ruslin所着的书Interprocess Communication Mechanisms的第5章,或者更好 - 整本书。
至于您的第二个问题,商品硬件上的大多数现代操作系统会将流程放在不同的地址空间中,但流程也可以共享相同的地址空间(请参阅Virtual Memory,Memory Protection )。无论哪种方式,如果IPC机制由内核处理,那么两个进程将引用相同的“内核对象”,如您所述。如果在没有内核的情况下(几乎)实现互斥(如某种使用“共享内存”的自旋锁),则两个进程都会引用相同的物理内存,即使它们的内存虚拟地址可能不同。 / p>
希望它有所帮助。祝你好运!
答案 1 :(得分:2)
为了清楚起见,POSIX(和linux)支持两个单独的信号量系列,它们具有两种不同的接口和使用方法。
有较旧的SysV信号量,包括semget
,semop
,semctl
和(有些可选)ftok
。
更现代的“posix”信号量包括sem_open/sem_init
,sem_wait
,sem_post
,sem_close
和sem_unlink
。
设置/使用制度和功能不同,值得熟悉两者,以便了解哪些更适合您的用例。
您还可以使用pthreads包中的进程共享互斥锁。
答案 2 :(得分:1)
听起来像是在寻找System V IPC您可能会使用信号量来在进程之间进行同步。
的精彩介绍答案 3 :(得分:1)
你需要命名的互斥锁/信号量。看一下描述某些要点的this StackOverflow answer。这是描述pthread_mutexattr_setname_np
使用情况的IBM。有一点需要注意,Linux中的命名互斥体不是100%可移植的(即它可以在Ubuntu上工作,但不在CentOS上工作等等),所以你需要确保你的平台支持它。如果系统上没有命名的互斥锁,则可以使用带有一些等待条件的命名管道甚至本地套接字。另一个答案指出是SysV IPC。
您首先需要回答的最大问题是,您希望自己的应用与“跨Linux平台”兼容吗?