У меня есть N
количество дочерних элементов, которые должны выполнять некоторую работу в цикле, одновременно синхронизируясь друг с другом. А именно, если дочерний процесс находится на i-й итерации, все остальные дочерние процессы должны быть на i-й итерации. Мне нужно синхронизировать их с семафорами, но я не могу найти, как это сделать. Это код, который я написал:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/sem.h>
void sem_signal(int semid, int val) {
struct sembuf semaphore;
semaphore.sem_num = 0;
semaphore.sem_op = val;
semaphore.sem_flg = 0;
semop(semid, &semaphore, 1);
}
void sem_wait(int semid, int val) {
struct sembuf semaphore;
semaphore.sem_num = 0;
semaphore.sem_op = (-1 * val);
semaphore.sem_flg = 0;
semop(semid, &semaphore, 1);
}
int main() {
int sem_worker = semget(1, 1, 0700 | IPC_CREAT);
semctl(sem_worker, 0, SETVAL, 0);
int process_index = 0;
int N = 4, pid;
for (process_index = 0; process_index < N; process_index++) {
pid = fork();
if (pid == -1) {
printf("ERROR: cannot fork!\n");
return EXIT_FAILURE;
}
if (pid == 0)
break;
}
if (pid!=0) // parent
pause();
else {
int i = 0;
while (i < 3) {
printf("process %d: i: %d\n", process_index, i);
sem_signal(sem_worker, 1); // increase the semaphore by one
sem_wait(sem_worker, N); // wait for all the other childs
i += 1;
}
}
}
Но когда я запускаю его, он не может продолжаться после первой итерации.
process 0: i: 0
process 1: i: 0
process 3: i: 0
process 2: i: 0
process 0: i: 1
Я понимаю, почему это происходит. Это потому, что один из процессов делает семафор 0 и переходит к следующей итерации, но все остальные все еще ждут. Итак, как мне написать свой код, чтобы решить эту проблему?
P.S. Функции sem_signal
и sem_wait
я взял откуда-то еще, поэтому не знаю, как они работают, но уверен, что они работают правильно. Например, если я пишу sem_wait(my_sem, num_of_children)
в родительском для ожидания всех дочерних процессов и увеличиваю my_sem
на 1 в дочерних процессах, когда они заканчиваются, это работает.
main
, то я их не автор :D Спасибо за предложение, я рассмотрю его. - person Asocia   schedule 03.06.2020