Как создавать темы только в том случае, если предыдущие потоки закончены?pthread wait другие темы для завершения
main {
create thread1 & thread2
wait for thread1 & thread2 to finish
create thread3 & thread4
}
Как создавать темы только в том случае, если предыдущие потоки закончены?pthread wait другие темы для завершения
main {
create thread1 & thread2
wait for thread1 & thread2 to finish
create thread3 & thread4
}
Чтобы дождаться окончания резьбы, используйте pthread_join()
.
В этом случае, вероятно, вам, скорее всего, будет лучше оставить thread1 и thread2 запущенными, и пусть они выполняют работу thread3 и thread4 соответственно, как только они закончат выполнение начальной фазы работы. Вы можете использовать pthread_barrier_wait()
, чтобы гарантировать, что ни вторая часть работы не завершится, пока оба не завершили первую фазу.
Это лучший подход, поскольку создание и выход из потоков обычно имеют значительные накладные расходы.
Ну, вы можете использовать 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;
}