• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
thread_func(void * p)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 
main(int argc,char ** argv)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