/* yield_count.c */ #define _GNU_SOURCE #include #include #include #include typedef void *(*create_func)(void *); static int child_ran = 0; static int parent_ran = 0; static int *child_run, *parent_run; static void *child_function(int *runs) { register int i, run = *runs; child_ran = 1; for (i = 0; i < run; i++) { for (child_run[i] = 0; !parent_ran; child_run[i]++) { sched_yield (); } parent_ran = 0; child_ran = 1; } return NULL; } int main(int argc, char *argv[]) { int i, runs; pthread_t child_thread; if (argc != 2) { fputs("Usage: yield runs, where runs is the number of times to try yielding\n", stderr); return EXIT_FAILURE; } i = 1; runs = atoi (argv[i]); child_run = (int *) malloc (runs * sizeof (int)); parent_run = (int *) malloc (runs * sizeof (int)); pthread_create(&child_thread, NULL, (create_func) child_function, &runs); parent_ran = i; for (i = 0; i < runs; i++) { for (parent_run[i] = 0; !child_ran; parent_run[i]) { sched_yield (); } child_ran = 0; parent_ran = 1; } pthread_join(child_thread, NULL); puts("Parent statistics:"); for (i = 0; i < runs; i++) { printf (" Run %d: %d yields before the child ran\n", i, parent_run[i]); } puts("Child statistics:"); for (i = 0; i < runs; i++) { printf (" Run %d: %d yields before the parent ran\n", i, child_run[i]); } free (child_run); free (parent_run); return EXIT_SUCCESS; }