У меня есть массив с именем doneArray, в котором я храню единицы, когда поток завершается.Например, в потоке 4 непосредственно перед вызовом pthread_exit
я установил doneArray [4] равным 1. Поэтому я могу запустить doneArray, чтобы увидеть, завершился ли данный поток.
В этом цикле в моем main()
код, я создаю поток, затем проверяю, завершены ли какие-либо потоки.Если они это сделают, я присоединяюсь к ним.Получающееся поведение порой сумасшедшее и не работает так же, как если бы у меня был отдельный цикл соединения.
for(long i = 0; i < numberOfThreads; i++){
pthread_create(&threads[i], NULL, body, (void*) i);
sleep(random() % 5 + 1);
//the loop that creates new threads should join threads that have finished
for(int j = 0; j < numberOfThreads; j++){
if(doneArray[j] == 1){
pthread_join(threads[j], &retval);
}
}
}
Мой инструктор сказал нам делать pthread_create
и pthread_join
в одном и том жепетля или мы потеряем очки.Я очень сбит с толку, потому что ранее меня учили НЕ делать этого, и другие ответы, которые я видел на этом сайте, также говорили о том, чтобы выполнить объединение в отдельном цикле:
If we put the pthread_join() in the same loop with pthread_create(), the calling thread i.e. main() will wait for the thread 0 to finish its work before creating the thread 1. This would force the threads to execute sequentially, not in parallel. Thus it would kill the purpose of multi-threading.