如何解决C ++在另一个进程之后执行一个子进程迭代
我想创建两个包含一些迭代的子进程,以便进程 X 中的迭代 l 始终在进程 Y 中的迭代 l+1 之后执行。
#include <stdio.h>
#include <unistd.h>
#include <bits/stdc++.h>
#include <sys/wait.h>
#include <semaphore.h>
using namespace std;
sem_t mut;
int x = 2;
int main()
{
int cpX = fork();
sem_init(&mut,1,1);
if (cpX == 0)
{
//child A code
for (int i = 0; i < 10; i++)
{
sem_wait(&mut);
cout << "Inside X:" << getpid() << "," << i << '\n';
sleep(rand() % 5);
}
exit(0);
}
else
{
int cpY = fork();
if (cpY == 0)
{
//child B code
for (int i = 0; i < 10; i++)
{
cout << "Inside Y:" << getpid() << "," << i << '\n';
sleep(rand() % 5);
sem_post(&mut);
}
//sem_wait(&mut);
exit(0);
}
else
{
//sleep(50);
//wait(NULL);
//wait(NULL);
exit(0);
// wait(NULL);
}
}
}
然而在这里,X 执行一次,然后 Y 开始执行,X 再也不会执行。为什么会发生这种情况?
解决方法
fork
期间的父/子正在执行复制,因此它们不会引用相同的信号量对象。因此,mut
不会像您假设的那样共享。您的代码段几乎是正确的,您只需稍作更改即可按预期工作。
由于您使用的是未命名的信号量,因此您需要在共享区域中实例化该信号量对象:
#include <sys/mman.h>
sem_t *mut = (sem_t*)mmap(NULL,sizeof(*mut),PROT_READ |PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
sem_init(mut,1,1);
通过这些细微的调整,您上面的代码段现在可以按预期工作,因为它们现在指的是同一个信号量对象。
另外,一些提示:sem_post
是解除阻塞调用,而 sem_wait
是阻塞调用。您还需要注意 sem_post
发送的信号可能会在此时没有人等待信号量时丢失。
这类东西最好的参考是Unix Network Programming: Interprocess Communication by Richard Stevens
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。