让我先告诉你这个功能:
for (i=0; i<3;i=i+2){
pthread_create(&thread1, NULL, &randtrack, (void *)&rnum_array[i]);
pthread_create(&thread2, NULL, &randtrack, (void *)&rnum_array[i+1]);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
}
print final result here;
我的理解是在创建两个线程后,父线程将在join(thread1)时被阻塞,线程2实际上比thread1更早回来了什么?如何让更长的线程始终落后?
由于
答案 0 :(得分:1)
如果thread2
完成且thread1
没有完成,您将继续等待thread1
完成。然后你会等到thread2
完成,这将或多或少地瞬间完成。等待线程的顺序无关紧要(除非线程尝试直接相互交互,例如通过彼此调用pthread_kill
或pthread_join
)。
更新:您的设计对于您实际尝试的内容完全错误。你想这样做:
创建一个结构来跟踪需要完成的工作。它应该由互斥锁保护,跟踪当前正在工作的线程数,以及需要分配的下一个工作单元是什么。
创建线程时,让它们运行一个获取互斥锁的函数,编写下一个工作单元,增加运行的线程数,然后完成工作。
当线程完成一个工作单元时,它应该获取互斥锁,减少运行的线程数,并查看是否还有更多工作要做。当没有工作要做时,线程应该终止。
您现在可以等待所有线程终止,这只会在所有工作完成后才会发生。这消除了工作单元上的循环。
请学习一个非常重要的一般规则 - 线程只是完成工作的事情。您希望代码关注的是做工作,而不是如何完成工作。尝试等待工作完成,而不是让线程完成。