Как мне ждать внутри дочернего процесса, пока родительский процесс не достигнет определенной точки? - PullRequest
0 голосов
/ 03 января 2019

псевдокод:

Child:
...
wait until parent prints "blabla"
...

Parent:
...
print "blabla"
...

Я не могу использовать wait, потому что это было бы наоборот, и более того, я хочу продолжить родительский процесс после print "blabla", параллельной дочернему процессу.
Я мог бы представить, чтобы поделиться с mmap a pthread_mutex_t и решите вопрос с взаимным исключением, но я не уверен в этом и хотел спросить, может ли существовать очень простое решение.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Имеют две глобальные переменные, одну для блокировки мьютекса и другую для сигнальной переменной, подобной этой.

pthread_cond_t signal = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t cond_mutex = PTHREAD_COND_INITIALIZER;

В вашем родительском потоке, когда вы печатаете сигнал blabla, дочерний поток:

pthread_mutex_lock(&cond_mutex);
pthread_cond_signal(&signal);
pthread_mutex_unlock(&cond_mutex);

В вашем дочернем потоке дождитесь сигнала:

struct timespec time_to_wait = {0, 0};
time_to_wait.tv_sec = time(NULL) + 10;//10 secs
pthread_mutex_lock(&cond_mutex);
status = pthread_cond_timedwait(&signal,&cond_mutex, &time_to_wait);
pthread_mutex_unlock(&cond_mutex);

Вы можете расширить этот код, чтобы обрабатывать несколько раз, ожидая возникновения условия каждые 't' секунд в цикле, или просто подождать один раз 'T 'секунд и выйти.Обратитесь к этому doc для получения возвращаемых значений.

0 голосов
/ 03 января 2019

Для этого можно использовать сигналы. После завершения определенной задачи родительский процесс должен отправить сигнал дочернему процессу с помощью системного вызова Kill и, обновив обработчик сигнала дочернего процесса, может выполнить дополнительную задачу.

Ребенок: signal_handler () {...} main () {signal (SIGINT, signal_handler);while (1); // дождемся, пока родитель напечатает «blabla»}

Parent:
...
print "blabla"
 kill(pid_of_child,signal)
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...