C ++ pthreads, основная функция перестает работать рано

0

Я делаю свою первую многопоточную программу и имею некоторые проблемы. Я основал код на примере, который я нашел в Интернете, который работал нормально, пока я не внес свои изменения. В приведенной ниже основной функции выполняется несколько потоков, которые выполняют другую функцию. Эта функция запускает экземпляры другой c++ программы, которую я написал, которая отлично работает. Проблема в том, что после того, как программа создает все потоки, она перестает работать. Остальные потоки продолжают работать и работают нормально, но основной поток останавливается, даже не распечатывая выражение cout, которое я ему дал. Например, если я запустил его, выход будет следующим:

Enter the number of threads:
// I enter '3' 
main() : creating thread, 0
this line prints every time
main() : creating thread, 1
this line prints every time
main() : creating thread, 2
this line prints every time

за этим следует весь вывод из моей другой программы, которая работает 3 раза. Но основная функция никогда не распечатывает "Эта строка никогда не печатается". Я уверен, что есть некоторые фундаментальные недоразумения в том, как работают потоки.

#include <iostream>
#include <stdlib.h>
#include <cstdlib>
#include <pthread.h>
#include <stdio.h>
#include <string>
#include <sstream>
#include <vector>
#include <fstream>
#include <unistd.h>

using namespace std;

struct thread_data{
   int  thread_id;
};

void *PrintHello(void *threadarg)
{
   struct thread_data *my_data;

   my_data = (struct thread_data *) threadarg;

   stringstream convert;
   convert << "./a.out " << my_data->thread_id << " " << (my_data->thread_id+1) << " " << my_data->thread_id;
   string sout = convert.str(); 
   system(sout.c_str());

   pthread_exit(NULL);
}

int main ()
{
   int NUM_THREADS;

   cout << "Enter the number of threads:\n";
   cin >> NUM_THREADS;

   pthread_t threads[NUM_THREADS];
   struct thread_data td[NUM_THREADS];
   int i;

   for( i=0; i < NUM_THREADS; i++ ){
      cout <<"main() : creating thread, " << i << endl;
      td[i].thread_id = i;
      pthread_create(&threads[i], NULL, PrintHello, (void *)&td[i]);
      cout << endl << "this line prints every time" << endl;
   }

   cout << endl << "This line is never printed out";

   pthread_exit(NULL);
}
  • 0
    Вы не очищаете свои буферы.
  • 0
    Поэтому мне нужно использовать cout << flush в других моих темах?
Показать ещё 2 комментария
Теги:
multithreading
main
pthreads

1 ответ

0

Это потому, что вы не используете pthread_join(threads[i],NULL). pthread_join() предотвращает завершение основной операции до завершения выполнения потоков

Ещё вопросы

Сообщество Overcoder
Наверх
Меню