#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(), указывающих один и тот же целевой поток * (и, кроме того, в вашем случае это также не было проблемой).