等待多个信号 - pthread

时间:2011-10-04 15:21:18

标签: pthreads

我正在构建一个简单的工作系统,允许我创建一个具有依赖关系的工作图...类似于:

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.

我正在使用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 个答案:

答案 0 :(得分: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()指定相同的目标线程*(此外,这也不是你的问题)。