gpt4 book ai didi

c - 我如何一次最多 fork 父进程的 5 个子进程?

转载 作者:太空宇宙 更新时间:2023-11-04 05:46:41 25 4
gpt4 key购买 nike

我有以下代码,我试图一次最多允许 5 个 child 运行,但我不知道如何在 child 退出时减少 child 数量。

struct {
char *s1;
char *s2;
} s[] = {
{"one", "oneB"},
{"two", "twoB"},
{"three", "thr4eeB"},
{"asdf", "3th43reeB"},
{"asdfasdf", "thr33eeB"},
{"asdfasdfasdf", "thdfdreeB"},
{"af3c3", "thrasdfeeB"},
{"fec33", "threfdeB"},
{NULL, NULL}
};

int main(int argc, char *argv[])
{
int i, im5, children = 0;
int pid = fork();
for (i = 0; s[i].s2; i++)
{
im5 = 0;
switch (pid)
{
case -1:
{
printf("Error\n");
exit(255);
}
case 0:
{
printf("%s -> %s\n", s[i].s1, s[i].s2);
if (i==5) im5 = 1;
printf("%d\n", im5);
sleep(i);
exit(1);
}
default:
{ // Here is where I need to sleep the parent until chilren < 5
// so where do i decrement children so that it gets modified in the parent process?
while(children > 5)
sleep(1);
children++;
pid = fork();
}
}
}
return 1;
}

根据评论,修订版似乎可以工作

struct {
char *s1;
char *s2;
} s[] = {
{"one", "oneB"},
{"two", "twoB"},
{"three", "thr4eeB"},
{"asdf", "3th43reeB"},
{"asdfasdf", "thr33eeB"},
{"asdfasdfasdf", "thdfdreeB"},
{"af3c3", "thrasdfeeB"},
{"fec33", "threfdeB"},
{NULL, NULL}
};

pthread_mutex_t children_count_lock;
int children = 0;

int main(int argc, char *argv[])
{
int i, im5;
int pid = fork();
for (i = 0; s[i].s2; i++)
{
im5 = 0;
switch (pid)
{
case -1:
{
printf("Error\n");
exit(255);
}
case 0:
{
printf("%s -> %s\n", s[i].s1, s[i].s2);
if (i==5) im5 = 1;
printf("%d\n", im5);
sleep(i);

pthread_mutex_lock(&children_count_lock);
children = children - 1;
if (children < 0) children = 0;
pthread_mutex_unlock(&children_count_lock);

exit(1);
}
default:
{
if (children > 4)
wait();

pthread_mutex_lock(&children_count_lock);
children++;
pthread_mutex_unlock(&children_count_lock);

pid = fork();
}
}
}
return 1;
}

最佳答案

wait() 系列函数将暂停父进程,直到子进程退出(这样做而不是休眠)。


不,您根本不需要临界区——子进程和父进程不共享内存。在您的默认情况下,您的所有需求都是这样的:

    default:
{
children++; // Last fork() was successful

while (children >= 5)
{
int status;
// Wait for one child to exit
if (wait(&status) == 0)
{
children--;
}
}

pid = fork();
}

(忘了我之前说的初始化children为1,我没注意到children++应该在while循环之前)

关于c - 我如何一次最多 fork 父进程的 5 个子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2729367/

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