Home | History | Annotate | Download | only in tests
      1 // Create threads in such a way that there is a realistic chance that the
      2 // parent thread finishes before the created thread finishes.
      3 
      4 
      5 #include <assert.h>
      6 #include <stdlib.h>
      7 #include <stdio.h>
      8 #include <pthread.h>
      9 
     10 
     11 static pthread_t s_thread[1000];
     12 static int       s_arg[1000];
     13 
     14 static void* thread_func(void* p)
     15 {
     16   int thread_count = *(int*)(p);
     17   if (thread_count > 0)
     18   {
     19     thread_count--;
     20     // std::cout << "create " << thread_count << std::endl;
     21     s_arg[thread_count] = thread_count;
     22     pthread_create(&s_thread[thread_count], 0, thread_func,
     23                    &s_arg[thread_count]);
     24 #if 0
     25     std::cout << "created " << thread_count << "(" << s_thread[thread_count]
     26               << ")" << std::endl;
     27 #endif
     28   }
     29   return 0;
     30 }
     31 
     32 int main(int argc, char** argv)
     33 {
     34   unsigned thread_count;
     35   int i;
     36 
     37   thread_count = argc > 1 ? atoi(argv[1]) : 50;
     38   assert(thread_count <= sizeof(s_thread) / sizeof(s_thread[0]));
     39   assert(thread_count >= 1);
     40   thread_count--;
     41   // std::cout << "create " << thread_count << std::endl;
     42   pthread_create(&s_thread[thread_count], 0, thread_func,
     43                  &thread_count);
     44 #if 0
     45   std::cout << "created " << thread_count << "(" << s_thread[thread_count]
     46             << ")" << std::endl;
     47 #endif
     48   for (i = thread_count; i >= 0; i--)
     49   {
     50     // std::cout << "join " << i << "(" << s_thread[i] << ")" << std::endl;
     51     pthread_join(s_thread[i], 0);
     52   }
     53   return 0;
     54 }
     55