gpt4 book ai didi

c - 等待所有进程到达程序中的某个点,然后恢复

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:39 25 4
gpt4 key购买 nike

我有一个通过 fork() 创建许多进程的应用程序。在某些时候,我想暂停它们并等待它们全部完成之前的任务。然后一次启动它们。

for (int i = 0; i < N; i++)
{
if(fork() == 0)
{
//some operations here
<----- wait here for all N forked processes
//some operations I want all processes start at similiar time

我不希望任何 child 放弃。

最佳答案

这似乎是为信号量量身定做的。具体来说,这很容易用“System V semaphores”来实现。请参阅 semget(2)semop(2)

想法是您在父级中获得一个信号量,将其值初始化为 N,然后让每个子级在“准备好”时将值减 1。所有子级等待结果变成 0。瞧。

这是一个示例程序

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#define N 5

int main(int ac, char **av)
{
int i, n, sem_id;
sem_id = semget(IPC_PRIVATE, 1, 0777);

struct sembuf buf;
buf.sem_num = 0;
buf.sem_flg = 0;

// Initialize semaphore value to N
buf.sem_op = N;
n = semop(sem_id, &buf, 1);

// All children will do the same thing:
// decrement semaphore value by 1
// wait for semaphore value == 0

for (i = 0; i < N; ++i) {
if (fork() == 0) {
printf("Child %d (%d) started\n", i, getpid());
sleep(i + 1); // Sleep awhile.
buf.sem_op = -1;
n = semop(sem_id, &buf, 1);
buf.sem_op = 0;
n = semop(sem_id, &buf, 1);
printf("Child %d (%d) done\n", i, getpid());
return 0;
}
}
return 0;
}

关于c - 等待所有进程到达程序中的某个点,然后恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30642859/

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