【问题标题】:Waiting on multiple signals - pthread等待多个信号 - pthread
【发布时间】:2011-10-04 15:21:18
【问题描述】:

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

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() 的结果 指定相同的目标线程是未定义的。

如何在没有崩溃的情况下获得相同的结果?

谢谢

【问题讨论】:

    标签: pthreads


    【解决方案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() 并指定相同的目标线程*(而且在您的情况下这也不是问题)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 2016-06-21
      • 2011-12-08
      • 1970-01-01
      相关资源
      最近更新 更多