join () темы в main (). Вы выходите из основного и выходите из своей программы, которая убивает другие потоки. Измените код на что-то вроде
clock_gettime(CLOCK_REALTIME, &start_time);
pthread_t threadID[2];
pthread_create(&threadID[0], NULL, task1, NULL);
pthread_create(&threadID[1], NULL, task2, NULL);
for (int i = 0; i < 2; ++i)
pthread_join(threadID[i], NULL);
clock_gettime(CLOCK_REALTIME, &end_time);
//... the rest
Не уверен, где именно вы хотите поместить таймер окончания. Таким образом, вы также синхронизируете два вызова join (), но они должны быть минимальными. Если вы установите таймер перед соединением, то вы закончите свой таймер до того, как ваши потоки фактически закончатся - все, что вам нужно, - это время, сколько потребуется для завершения двух вызовов create_thread.