Ожидание нескольких сигналов — pthread

#pthreads

#pthreads

Вопрос:

Я создаю простую систему заданий, которая позволила бы мне создавать график заданий с зависимостями… Что-то вроде:

 Job root;
Job job1;
Job job1_1;
Job job1_2;
Job job2(amp;job1, 1); // job2 cannot start until job1 finishes.

job1.addJob(amp;job1_1);
job1.addJob(amp;job1_2);
root.addJob(amp;job1);
root.addJob(amp;job2);

root.execute(); // execute the job graph.
  

Я использую pthreads для реализации этого, но я новичок в программах такого типа, и я не могу найти способ синхронизировать все это.

Я попытался использовать pthread_join, чтобы сделать что-то вроде этого :

 void Job::execute()
{
    for(int i = 0; i < numDependencies;   i)
        dependencies[i].join(); // calling pthread_join

    for(int i = 0; i < numSubJobs;   i)
        subJobs[i].start(); // calling pthread_create

    ... do some work here

    for(int i = 0; i < numSubJobs;   i)
        subJobs[i].join(); // calling pthread_join
}
  

Но сбой моей программы при одном из вызовов pthread_join.

Из документации pthread :

Результаты нескольких одновременных вызовов функции pthread_join(), указывающей один и тот же целевой поток, не определены.

Как я могу добиться тех же результатов, но без сбоев?

Спасибо

Ответ №1:

pthred_join() ожидает завершения созданного потока. И программа выходит из строя, потому что вы используете неинициализированные члены Job (скажем, pthread_t thread;). Если поток заданий создается в методе start(), то вам следует переписать execute() следующим образом:

 void Job::execute()
{
    for(int i = 0; i < numDependencies;   i)
        dependencies[i].start(); // calling pthread_create

    for(int i = 0; i < numDependencies;   i)
        dependencies[i].join(); // calling pthread_join
...
  

В этом случае вы не получите * несколько одновременных вызовов pthread_join(), указывающих один и тот же целевой поток * (и, кроме того, в вашем случае это также не было проблемой).