gpt4 book ai didi

c - 意外输出运行信号量

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:57 24 4
gpt4 key购买 nike

我正在尝试编写一个程序来 fork 另一个进程并保持同步,以便第一个进程在第二个进程完成第 (i-1) 次迭代之前不会开始其第 (i) 次迭代。这可能只使用两个信号量吗?这是我目前所拥有的:

#include <stdio.h>   
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <semaphore.h>

sem_t semA, semB,sem,m;

int main(void)
{
int i;

pid_t child_a, child_b,pid2,pid3;
sem_init(&semA, 0, 1);
sem_init(&semB, 0, 0);
sem_init(&m, 0, 0);

child_a = fork();
//wait();

if (child_a == 0) {


// int j;

pid2 =getpid();
for (i = 0; i < 5; )
{
sem_wait(&semA);
//sem_wait(&m);
printf("child1: %d\n", i);
i++;
//printf("pid1: %d\n", pid2);
//printf("--------------------------\n");
sleep(3);
//sem_post(&m);

sem_post(&semB);
}
}
else {

child_b = fork();
//wait();
if (child_b == 0) {

pid3 =getpid();
for (i = 0; i < 5;)
{
sem_wait(&semB);
//sem_wait(&m);
printf("child2: %d\n", i);
i++;
//printf("pid2: %d\n", pid3);
//printf("--------------------------\n");
sleep(5);
//sem_post(&m);
sem_post(&semA);

}

}
}

exit(0);
return 0;
}

我期望的输出是:

child1: 0
child2: 0
child1: 1
child2: 1
child1: 2
child2: 2
child1: 3
child2: 3
child1: 4
child2: 4
child1: 5
child2: 5
child1: 6
child2: 6
child1: 7
child2: 7
child1: 8
child2: 8
child1: 9
child2: 9

但我只有一个 child :

child1: 0

最佳答案

您可能需要三个信号量

sem1sem2sem3

进程 1:

if(FirstRun){
Initialize the semaphores
wait for sem2
}

post sem1
wait for sem3

进程 2:

if(FirstRun){
Initialize the semaphores
post sem2
}

wait for sem1
post sem3

注意:在初始化信号量中,您必须将信号量映射到共享内存,以便两个进程都可以访问它。还要将它们初始化为一些默认值,比如 0, 0, 0

关于c - 意外输出运行信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16549939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com