pthread等待其他线程完成

时间:2015-07-21 23:57:57

标签: pthreads pthread-join

如何仅在以前的线程完成时创建线程?

main {
    create thread1 & thread2

    wait for thread1 & thread2 to finish
    create thread3 & thread4
}

2 个答案:

答案 0 :(得分:1)

要等待线程完成,请使用 DateTime dateEnd = Convert.ToDateTime("01/08/2015"); int monthsBack = 24; DateTime dateStart = dateEnd.AddMonths(-monthsBack); int janCount = 0; for (DateTime dd = dateStart; dd < dateEnd; dd = dd.AddMonths(1)) { if (dd.Month == 1) //if jan janCount += 1; } MessageBox.Show(dateStart.ToShortDateString() +" to "+ dateEnd.ToShortDateString() + Environment.NewLine +Environment.NewLine + janCount.ToString() );

在这种情况下,你可能最好只让thread1和thread2运行,让他们在完成初始工作阶段后分别完成thread3和thread4的工作。您可以使用pthread_join()确保在完成第一阶段之前不会进入第二阶段的工作。

这是一种更好的方法,因为创建和退出线程通常会产生相当大的开销。

答案 1 :(得分:0)

好吧,你可以使用pthread_join。这里:http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html有一个例子,它有详细记录。我对线程的经验很少,但我对它进行了一些修改,我认为它适用于你的情况。

#include <stdio.h>
#include <pthread.h>

typedef struct {
    int *ar;
    long n;
} subarray;


void *incer(void *arg)
{
    long i;
    for (i = 0; i < ((subarray *)arg)->n; i++)
       ((subarray *)arg)->ar[i]++;
}

int main(){

int        ar[1000000];
pthread_t  th1, th2, th3, th4;
subarray   sb1, sb2;


sb1.ar = &ar[0];
sb1.n  = 500000;
(void) pthread_create(&th1, NULL, incer, &sb1);

sb2.ar = &ar[500000];
sb2.n  = 500000;
(void) pthread_create(&th2, NULL, incer, &sb2);

if(pthread_join(th1, NULL)==0 && pthread_join(th2, NULL)==0){
    printf("Creating new threads...\n");
    (void) pthread_create(&th3, NULL, incer, &sb1);
    (void) pthread_create(&th4, NULL, incer, &sb2);
}

return 0;
}