Потоки остановились после возврата функции - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать несколько рабочих потоков в функции с именем engine_setup, но каждый раз, когда функция возвращается, каждый поток также останавливается.Я пытался создать pthread id как глобальный указатель, но это не помогло.вот глобальный: pthread_t * threadIDs; функция engine_setup:

query_helper* engine_setup(size_t n_processors) {
    //some code that is not relevant
    int err;
    threadIDs=malloc(n_processors*sizeof(*threadIDs));
    for(int i=0;i<n_processors;i++){
      err = pthread_create(&threadIDs[i],NULL,tp,(void*)helper);
      if (err != 0)
      printf("can't create thread \n");
    }
    printf("end setup\n");
    return helper;
}

и указатель на функцию потока здесь:

void* tp(void * ptr){
    query_helper * helper=(query_helper*)ptr;
    while(1){
        printf("1\n");
    }
}

вывод выглядит примерно так:

1
1
1
1
1
1
1
1
1
end setup

, который показывает, что все потоки остановились при возврате engine_setup.Есть ли способ заставить их работать?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Да, вы можете вызвать pthread_join (threadIds [i], null);(для всех потоков i), который будет ожидать возврата функции thred.

Вы можете использовать второй аргумент для хранения возвращаемого значения из потока.Т.е.:

void *results[n_processors];
for(int i=0; i<n_processors; i++){
    pthread_join(threadIds[i], &results[i]);
}
0 голосов
/ 25 мая 2018

Выходит ли ваша программа после возврата из функции?В таком случае вы захотите использовать pthread_join в каждом потоке, чтобы программа ожидала завершения каждого потока, прежде чем выйти.

...