如何仅在以前的线程完成时创建线程?
main {
create thread1 & thread2
wait for thread1 & thread2 to finish
create thread3 & thread4
}
答案 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;
}