2011-10-04 123 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()指定相同的目標線程*在這種情況下(和而且這在你的情況下也不是問題)。