#include #include #include #include #include void *sayGreeting(void *param); // Handle single greeting // Global greeting string (Bad design!! Don't do this!) char *greeting; int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "Usage: %s [...]\n", argv[0]); exit(1); } int greetingCt = argc - 1; // Number of command-line greetings pthread_t tid[greetingCt - 1]; // List of thread ids // Create greeting threads int threadIdx; for (threadIdx = 0; threadIdx < greetingCt-1; threadIdx++) { greeting = argv[threadIdx + 1]; int rtn = pthread_create(&tid[threadIdx], NULL, sayGreeting, NULL); if (rtn != 0) { fprintf(stderr, "Unable to create pthread: %s\n", strerror(rtn)); exit(1); } pthread_yield(); } greeting = argv[threadIdx+1]; sayGreeting(NULL); // Wait for threads to complete for (int i = 0; i < greetingCt - 1; i++) { int rtn = pthread_join(tid[i], NULL); if (rtn != 0) { fprintf(stderr, "Unable to join thread: %s\n", strerror(rtn)); exit(1); } } exit(0); } // Function to handle single greeting void *sayGreeting(void *param) { // Print message random number of times for (int i = 0; i < 1000; i++) { printf("%lu: %s\n", pthread_self(), greeting); } pthread_exit(NULL); }