Я предполагаю, что происходит, если ваше приложение завершает работу до того, как ваши потоки получат возможность действительно выполнить полностью. Поскольку вы храните каждый дескриптор потока в массиве pthread_t threads[NUM_THREADS];
, вам нужно будет создать вызов
pthread_join должен быть сделан, что позволит блокировать поток вызывающей стороны, пока поток не будет выполнен и возвращен. Вы можете вызвать pthread_join
сразу после вызова pthread_create
или перебрать все свои дескрипторы и вызвать pthread_join
для каждого индекса в вашем массиве. Если после создания каждого потока выполняется вызов pthread_join
, новый поток не будет создан до тех пор, пока не завершится предыдущий. Если вы хотите выполнить их одновременно, лучшим вариантом будет цикл после создания всех потоков.
int main(int argc , char *argv[])
{
pthread_t threads[NUM_THREADS];
int *taskids[NUM_THREADS];
int rc, t, sum;
sum=0;
messages[0] = "English: Hello World!";
..............
messages[7] = "Latin: Orbis , te saluto!";
for(t=0;t<NUM_THREADS;t++)
{
sum = sum + t;
thread_data_array[t].thread_id = t;
thread_data_array[t].sum = sum;
thread_data_array[t].message = messages[t];
printf("Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL , PrintHello , (void *) &thread_data_array[t]);
//rc = pthread_create(&threads[t], NULL , PrintHello , NULL);
if (rc)
{
printf("ERROR; return code from pthread_create() is %d \n", rc);
exit(-1);
}
}
for(int index = 0; index < NUM_THREADS; ++index){
pthread_join(threads[index],NULL);//Wait for execution of each thread
}
}
Вам также не нужно звонить pthread_exit
в своей главной. Обычно это следует вызывать в потоке, который вы хотите завершить досрочно, где значение, переданное в pthread_exit
, можно получить из второго аргумента pthread_join