title: C++ detecting which thread is done using WaitForMultipleObjects
body: <p>I'm trying to  run 3 threads in the same time and then detect in main thread which one has finished. I'm using WaitForMultipleObject function but 3rd thread  seems to loop for this WFMO function, while it has already finished its job (printed result).</p>
  
  <pre><code>    #include &lt;Windows.h&gt;
      #include &lt;stdio.h&gt;
      #include &lt;conio.h&gt;
      //---------------------------------------------------------------------------
      #pragma argsused
      struct data 
      {
          char name[50];
      } data[3] = { { "[THREAD 0]" }, { "[THREAD 1]" },{ "[THREAD 2]" } };
  
      DWORD WINAPI th0()
  {
      //here are some calculations
      //also added 1s sleep
  
      //printing result
      return 0;
  
  }
  DWORD WINAPI th1()
  {
      //here are some other calculations
      //also added 1s sleep
  
      //printing result
  
      return 0;
  }
  DWORD WINAPI th2()
  {
      //here are some other simple calculations
      //also added 1s sleep
  
  
      //printing result
      return 0;
  }
  
  
      int priority[3] = { 0,0, 0};
      HANDLE threads[3]; 
      HANDLE functions[3];
  
  
      int main(int argc, char **argv)
      {
          int i;
          DWORD id; // thread's id
  
          printf("Program started...\n");
  
          functions[0] = th0;
          functions[1] = th1;
          functions[2] = th2; 
          for (i = 0; i &lt; 3; i++)
          {
              threads[i] = CreateThread(
                  NULL, // security atributes
                  0, // stack size
                  (LPTHREAD_START_ROUTINE)functions[i], // threads
                  NULL,// input data for threads
                  0, // creation's flags
                  &amp;id);//thread's id
              if (threads[i] != INVALID_HANDLE_VALUE)
              {
                  printf("Created thread %s with ID: %x\n",
                      data[i].name, id);          
                  SetThreadPriority(threads[i], priority[i]);
              }
          }
          bool f0=false, f1=false, f2=false;
          while(!f0 || !f1 || !f2)//while there is any unfinished thread
          {
              DWORD wfmo = WaitForMultipleObjects(3, threads, false, INFINITE);
  
              if (!f0 &amp;&amp; WAIT_OBJECT_0==wfmo)
              {
                  printf("%s is done!\n", data[0].name);
                  f0=true;
                  //CloseHandle(threads[0]);
                  //threads[0]=NULL;
  
              }
              if (!f1 &amp;&amp; WAIT_OBJECT_0 +1 == wfmo)
              {
                  printf("%s is done!\n", data[1].name);
                  f1=true;
                  //CloseHandle(watki[1]);
                  //watki[1]=NULL;
  
              }
              if (!f2 &amp;&amp; WAIT_OBJECT_0 +2 == wfmo)
              {
                  printf("%s is done!\n", data[2].name);
                  f2=true;
                  //CloseHandle(threads[2]);
                  //threads[2]=NULL;
              }
              if(wfmo==WAIT_TIMEOUT)
                  printf("timeout\n");
              if(wfmo==WAIT_FAILED)
                  printf("failed\n");
          }
  
  
          //Sleep(20000); //20s
          return 0;
      }
  </code></pre>
  
  <p>Output:</p>
  
  <pre><code>    Program started... 
      Created thread [THREAD 0] with ID: b00 
      Created thread [THREAD 1] with ID: a64 
      Created thread [THREAD 2] with ID: 7d0 
      [THREAD 2] Result: 131072 
      [THREAD 1] Result: 121393 
      [THREAD 0] Result: 362880 
      [THREAD 2] is done! 
      [THREAD 0] is done!
  </code></pre>