1 /* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2002-2023 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 This file is copied from schedlock.c. */ 19 20 #include <stdio.h> 21 #include <unistd.h> 22 #include <stdlib.h> 23 #include <pthread.h> 24 25 void *thread_function(void *arg); /* Pointer to function executed by each thread */ 26 27 #define NUM 5 28 29 unsigned int args[NUM+1]; 30 pthread_barrier_t mybarrier; 31 32 int main() { 33 int res; 34 int all_started; 35 pthread_t threads[NUM]; 36 void *thread_result; 37 long i; 38 39 pthread_barrier_init(&mybarrier, NULL, NUM + 1); 40 41 for (i = 0; i < NUM; i++) 42 { 43 args[i] = 1; /* Init value. */ 44 res = pthread_create(&threads[i], 45 NULL, 46 thread_function, 47 (void *) i); 48 } 49 50 all_started = 0; 51 while (!all_started) 52 { 53 all_started = 1; 54 for (i = 0; i < NUM; i++) 55 { 56 if (args[i] == 1) 57 { 58 all_started = 0; 59 break; 60 } 61 } 62 } 63 64 args[i] = 1; 65 /* Break here */ 66 thread_function ((void *) i); 67 68 exit(EXIT_SUCCESS); 69 } 70 71 void *thread_function(void *arg) { 72 int my_number = (long) arg; 73 int *myp = (int *) &args[my_number]; 74 75 (*myp) ++; /* Increment so parent knows child started. */ 76 pthread_barrier_wait(&mybarrier); 77 } 78 79