Я делаю свою первую многопоточную программу и имею некоторые проблемы. Я основал код на примере, который я нашел в Интернете, который работал нормально, пока я не внес свои изменения. В приведенной ниже основной функции выполняется несколько потоков, которые выполняют другую функцию. Эта функция запускает экземпляры другой 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);
}
Это потому, что вы не используете pthread_join(threads[i],NULL)
. pthread_join()
предотвращает завершение основной операции до завершения выполнения потоков