2015-07-21 4 views

ответ

1

Чтобы дождаться окончания резьбы, используйте pthread_join().

В этом случае, вероятно, вам, скорее всего, будет лучше оставить thread1 и thread2 запущенными, и пусть они выполняют работу thread3 и thread4 соответственно, как только они закончат выполнение начальной фазы работы. Вы можете использовать pthread_barrier_wait(), чтобы гарантировать, что ни вторая часть работы не завершится, пока оба не завершили первую фазу.

Это лучший подход, поскольку создание и выход из потоков обычно имеют значительные накладные расходы.

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; 
} 
Смежные вопросы