Pthread_join优先级

时间:2012-11-18 05:11:01

标签: pthreads

让我先告诉你这个功能:

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更早回来了什么?如何让更长的线程始终落后?

由于

1 个答案:

答案 0 :(得分:1)

如果thread2完成且thread1没有完成,您将继续等待thread1完成。然后你会等到thread2完成,这将或多或少地瞬间完成。等待线程的顺序无关紧要(除非线程尝试直接相互交互,例如通过彼此调用pthread_killpthread_join)。

更新:您的设计对于您实际尝试的内容完全错误。你想这样做:

  1. 创建一个结构来跟踪需要完成的工作。它应该由互斥锁保护,跟踪当前正在工作的线程数,以及需要分配的下一个工作单元是什么。

  2. 创建线程时,让它们运行一个获取互斥锁的函数,编写下一个工作单元,增加运行的线程数,然后完成工作。

  3. 当线程完成一个工作单元时,它应该获取互斥锁,减少运行的线程数,并查看是否还有更多工作要做。当没有工作要做时,线程应该终止。

  4. 您现在可以等待所有线程终止,这只会在所有工作完成后才会发生。这消除了工作单元上的循环。

  5. 请学习一个非常重要的一般规则 - 线程只是完成工作的事情。您希望代码关注的是做工作,而不是如何完成工作。尝试等待工作完成,而不是让线程完成。