Ещё один пример создания потока в линукс си

исходник взят отсюда ,
но я немного отформатировал код -а то там он "слабочитаем" для простых смертных =


#include stdio.h>
#include errno.h>
#include pthread.h>
void * thread_func(void *arg) // главная и,собственно, есдиственная функция потока
{ 
  int i;
  int loc_id = * (int *) arg; // получаем переданный в поток параметр 
  for (i = 0; i < 4; i++)  /* запускаем цикл, который будет выводит на экран строчку 
   со значением параметра 4-ре раза*/
  {
	printf("Thread %i is running\n", loc_id);
	sleep(10); // приостанавливаем мыполнение на 10 миллисекунд
  }
}
int main(int argc, char * argv[]) // функция , в рамках которой и будут создаваться новые потоки
{ int id1, id2, result;
	pthread_t thread1, thread2;
	id1 = 1; // пареметр который будем передавать главной функции ,вызываемого далее потока
	
	result = pthread_create(&thread1, NULL, &thread_func, &id1); // создаём 1-ый дочерний поток
	if (result != 0) // если создать поток не удалось
	{
		perror("Creating the first thread");
		return EXIT_FAILURE;
	}
	id2 = 2;// пареметр который будем передавать главной функции ,вызываемого далее потока
	result = pthread_create(&thread2, NULL, &thread_func, &id2); // создаём 2-ой дочерний поток
	if (result != 0)
	{
		perror("Creating the second thread");
		return EXIT_FAILURE;
	}
	
	result = pthread_join(thread1, NULL); // ждём завершения первой нити (=потока)
	if (result != 0) 
	{
		perror("Joining the first thread");
		return EXIT_FAILURE;
	}
	
	result = pthread_join(thread2, NULL); // ждём завершения второй нити (=потока)
	if (result != 0)
	{
		perror("Joining the second thread");
		return EXIT_FAILURE;
	}
	
	printf("Done\n"); // выводим уведомление о заверщении работы
	return EXIT_SUCCESS; // возвращаем признак успешного завершения.
}


Функция pthread_join()