1 /* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2002-2023 Free Software Foundation, Inc. 4 5 Copyright 1992, 1993, 1994, 1995, 1999, 2002, 2003, 2007, 2008, 2009 6 Free Software Foundation, Inc. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. 20 21 This file is copied from schedlock.c. */ 22 23 #include <stdio.h> 24 #include <unistd.h> 25 #include <stdlib.h> 26 #include <pthread.h> 27 28 void *thread_function (void *arg); /* Pointer to function executed by each thread */ 29 30 static pthread_barrier_t threads_started_barrier; 31 32 static pthread_barrier_t threads_started_barrier2; 33 34 #define NUM 15 35 36 static int num_threads = NUM; 37 38 static unsigned int shared_var = 1; 39 40 int main () { 41 int res; 42 pthread_t threads[NUM]; 43 void *thread_result; 44 long i; 45 46 alarm (180); 47 48 pthread_barrier_init (&threads_started_barrier, NULL, NUM + 1); 49 50 pthread_barrier_init (&threads_started_barrier2, NULL, 2); 51 52 for (i = 0; i < NUM; i++) 53 { 54 res = pthread_create (&threads[i], 55 NULL, 56 thread_function, 57 (void *) i); 58 } 59 60 pthread_barrier_wait (&threads_started_barrier); 61 62 pthread_barrier_wait (&threads_started_barrier2); /* all threads started */ 63 64 pthread_join (threads[0], NULL); 65 66 /* first child thread exited */ 67 68 while (1) 69 sleep (1); 70 71 exit (EXIT_SUCCESS); 72 } 73 74 void 75 loop (void) 76 { 77 } 78 79 void *thread_function (void *arg) { 80 int my_number = (long) arg; 81 82 pthread_barrier_wait (&threads_started_barrier); 83 84 if (my_number > 0) 85 { 86 /* Don't run forever. Run just short of it :) */ 87 while (shared_var > 0) 88 { 89 shared_var++; 90 usleep (1); /* Loop increment. */ 91 loop (); 92 } 93 } 94 else 95 pthread_barrier_wait (&threads_started_barrier2); 96 97 pthread_exit (NULL); 98 } 99 100