2011-10-04 102 views
2

我建立一个简单的任务系统,让我来创建依赖关系的工作图...喜欢的东西:等待多信号 - 并行线程

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

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

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

我使用并行线程来实现这一点,但我新的这种类型的程序,我不能找到一种方法来同步所有这些。

我试着用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_join() 指定相同的目标线程是不确定的。

我怎样才能达到相同的结果,但没有崩溃?

感谢

回答

1

pthred_join()等待创建的线程终止。并且程序崩溃是因为您使用了Job的未初始化成员(比如说pthread_t线程;)。如果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()指定相同的目标线程*在这种情况下(和而且这在你的情况下也不是问题)。