我正在构建一个简单的工作系统,允许我创建一个具有依赖关系的工作图...类似于:
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()的结果 指定相同的目标线程是未定义的。
如何在没有崩溃的情况下实现相同的结果?
由于
答案 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()指定相同的目标线程*(此外,这也不是你的问题)。