1

我先给你看一下函数:

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早回来的是什么?怎样才能让更长的线程永远留在后面?

谢谢

4

1 回答 1

1

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

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

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

  2. 当您创建线程时,让它们运行一个获取互斥锁的函数,获取下一个工作单元,增加正在运行的线程数,然后执行工作。

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

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

请学习一个非常重要的一般规则——线程就是完成工作的东西。您希望您的代码专注于完成工作,而不是如何完成工作。尝试等待工作完成,而不是等待线程完成。

于 2012-11-18T05:40:41.970 回答