C 在同一循环中创建/连接pthread

C 在同一循环中创建/连接pthread,c,multithreading,parallel-processing,pthreads,C,Multithreading,Parallel Processing,Pthreads,我有一个名为donarray的数组,当线程完成时,我会将1存储在其中。例如,在调用pthread\u exit之前的线程4中,我将donarray[4]设置为1。所以我可以通过Donarray查看给定线程是否已完成 在我的main()code的这个循环中,我创建了一个线程,然后检查是否有线程已经完成。如果他们这样做,我就加入他们。结果的行为有时是疯狂的,并且不像我有一个单独的连接循环那样工作 for(long i = 0; i < numberOfThreads; i++){

我有一个名为donarray的数组,当线程完成时,我会将1存储在其中。例如,在调用
pthread\u exit
之前的线程4中,我将donarray[4]设置为1。所以我可以通过Donarray查看给定线程是否已完成

在我的
main()
code的这个循环中,我创建了一个线程,然后检查是否有线程已经完成。如果他们这样做,我就加入他们。结果的行为有时是疯狂的,并且不像我有一个单独的连接循环那样工作

   for(long i = 0; i < numberOfThreads; i++){

      pthread_create(&threads[i], NULL, body, (void*) i);

      sleep(random() % 5 + 1);

      //the loop that creates new threads should join threads that have finished
      for(int j = 0; j < numberOfThreads; j++){
         if(doneArray[j] == 1){
            pthread_join(threads[j], &retval);
         }
      }

   }
for(长i=0;i
我的导师告诉我们在同一个循环中执行
pthread\u create
pthread\u join
,否则我们将失去分数。我很困惑,因为我以前被教导不要这样做,我在这个网站上看到的其他答案也说要在一个单独的循环中加入:


如果我们将pthread_join()与pthread_create()放在同一个循环中,则调用线程即main()将等待线程0完成其工作,然后再创建线程1。这将强制线程按顺序执行,而不是并行执行。因此,它将扼杀多线程的目的。

您的讲师需要澄清他们在谈论什么,或者您需要找到另一位讲师。Donarray[j]==1
madness本身就是一堆锤子,因为它没有并发保护(我们可以看到),并且可以预见地在
i
的后一个循环中对已经连接的线程调用
pthread\u join
。不管怎样,你质疑他们的授权是否合理都是正确的。我拥有的唯一并发保护是在互斥锁内将Donarray的内容设置为1,但这对推进论点几乎没有什么作用,因为你的所有其他点都是有效的第七点如果你在互斥锁的保护下设置它,你不能在同一个互斥锁的保护下检查它。这就是我一开始提出这个问题的最终原因。不管怎样,正如你所注意到的,这一切的合理性都值得怀疑。在启动新线程的同一个循环中,主动加入先前的过期线程几乎没有什么好处。这样的蒙太奇需要更好的解决方案(也许是工作队列或团队模型)。老师想要这个肯定是有原因的。班上没有人有足够的勇气提问吗?假设在这个过程中没有其他线程,那么你发布的代码就相当于
for(long i=0;i
或者你不理解你的讲师的方向,或者你的讲师完全不知所措。因为你是对的-在一个循环中,绝对没有一点是在每次循环迭代中产生一个子线程,然后等待它完成的。如果线程数不超过机器字宽度,则可以将
donarray
存储在原子中。另外,原子通常比互斥保护变量快得多。()