mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
65 lines
1.7 KiB
C
65 lines
1.7 KiB
C
// Create threads in such a way that there is a realistic chance that the
|
|
// parent thread finishes before the created thread finishes.
|
|
|
|
|
|
#include <assert.h>
|
|
#include <limits.h> /* PTHREAD_STACK_MIN */
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <pthread.h>
|
|
|
|
|
|
static pthread_t s_thread[1000];
|
|
static int s_arg[1000];
|
|
|
|
static void* thread_func(void* p)
|
|
{
|
|
int thread_count = *(int*)(p);
|
|
pthread_attr_t attr;
|
|
|
|
if (thread_count > 0)
|
|
{
|
|
thread_count--;
|
|
// std::cout << "create " << thread_count << std::endl;
|
|
s_arg[thread_count] = thread_count;
|
|
pthread_attr_init(&attr);
|
|
pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
|
|
pthread_create(&s_thread[thread_count], &attr, thread_func,
|
|
&s_arg[thread_count]);
|
|
pthread_attr_destroy(&attr);
|
|
#if 0
|
|
std::cout << "created " << thread_count << "(" << s_thread[thread_count]
|
|
<< ")" << std::endl;
|
|
#endif
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
pthread_attr_t attr;
|
|
unsigned thread_count;
|
|
int i;
|
|
|
|
thread_count = argc > 1 ? atoi(argv[1]) : 50;
|
|
assert(thread_count <= sizeof(s_thread) / sizeof(s_thread[0]));
|
|
assert(thread_count >= 1);
|
|
thread_count--;
|
|
// std::cout << "create " << thread_count << std::endl;
|
|
pthread_attr_init(&attr);
|
|
pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
|
|
pthread_create(&s_thread[thread_count], &attr, thread_func,
|
|
&thread_count);
|
|
pthread_attr_destroy(&attr);
|
|
#if 0
|
|
std::cout << "created " << thread_count << "(" << s_thread[thread_count]
|
|
<< ")" << std::endl;
|
|
#endif
|
|
for (i = thread_count; i >= 0; i--)
|
|
{
|
|
// std::cout << "join " << i << "(" << s_thread[i] << ")" << std::endl;
|
|
pthread_join(s_thread[i], 0);
|
|
}
|
|
return 0;
|
|
}
|