/******************************************************************************/ /** @file "Pthreads/C/Primer 1 - argument/pthread_argument_passing_hello_1.c" @brief Nacin prosledjivanja vise argumenata nitima za vreme njihovog kreiranja. "Hello World" program koji korišćenjem POSIX Threads API-ja demonstrira još jedan od bezbednih načina za prosledjivanje argumenata nitima tokom njihovog kreiranja. U ovom slučaju koristimo strukturu kako bi prosledili veći broj argumenata.@n @n Autor ovog primera je Blaise Barney. Kod je preuzet iz Pthreads tutorijala sa adrese http://www.llnl.gov/computing/tutorials/pthreads/ i prilagodjen potrebama ovog kursa. */ /******************************************************************************/ #include #include #include /******************************************************************************/ /** @def NUM_THREADS @brief Broj niti koje treba kreirati */ #define NUM_THREADS 9 /******************************************************************************/ /** @brief Niz poruka koje će se ispisivati */ char* messages[NUM_THREADS]; /******************************************************************************/ /** @brief Struktura argumenata koje ćemo prosledjivati nitima */ struct thread_data { /** @brief ID broj niti. */ int thread_id; /** @brief Suma brojača. */ int sum; /** @property message @brief Poruka koju nit treba da ispiše. */ char* message; }; /******************************************************************************/ /** @brief Niz od @ref NUM_THREADS globalnih promenljivih tipa thread_data */ struct thread_data thread_data_array[NUM_THREADS]; /******************************************************************************/ /** @brief Posao koji svaka od niti treba da odradi @param thread_arg Generički pokazivač na strukturu tipa thread_data @return void* Rezultat izvršavanja funkcije Nakon budjenja svaka od niti će u zavisnosti od vrednosti polja prosledjenog argumenta ispisati poruku koja će sadržati broj niti, pozdravnu poruku na odgovarajućem jeziku i sumu brojača. */ void* print_hello(void* thread_arg) { int task_id, sum; char* hello_msg; struct thread_data* my_data; //sleep(1); my_data = (struct thread_data*) thread_arg; task_id = my_data->thread_id; sum = my_data->sum; hello_msg = my_data->message; printf("Thread %d: %s Sum=%d\n", task_id, hello_msg, sum); pthread_exit(NULL); } /******************************************************************************/ /** @brief Glavna nit programa. @param argc Broj argumenata komandne linije. @param argv Argumenti komandne linije. @return Vraća status izvršenja programa. Glavni program kreira @ref NUM_THREADS niti i prilikom kreiranja svakoj prosledjuje pokazivač na strukturu podataka tipa thread_data koji će niti iskoristiti za izvršenje zadatog posla. */ int main(int argc, char* argv[]) { pthread_t threads[NUM_THREADS]; int rc, t, sum; #ifdef WIN32 pthread_win32_process_attach_np(); #endif sum=0; messages[0] = "English: Hello World!"; messages[1] = "French: Bonjourc le monde!"; messages[2] = "Spanish: Hola al mundo"; messages[3] = "Klingon: Nuq neH!"; messages[4] = "German: Guten Tagc Welt!"; messages[5] = "Russian: Zdravstvytyec mir!"; messages[6] = "Japan: Sekai e konnichiwa!"; messages[7] = "Latin: Orbisc te saluto!"; messages[8] = "Serbian: Cao Svete!"; for (t = 0; t < NUM_THREADS; t++) { sum = sum + t; thread_data_array[t].thread_id = t; thread_data_array[t].sum = sum; thread_data_array[t].message = messages[t]; printf("Creating thread %d\n", t); rc = pthread_create(&threads[t], NULL, print_hello, (void*) &thread_data_array[t]); if (rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } } pthread_exit(NULL); #ifdef WIN32 pthread_win32_process_detach_np(); #endif } /******************************************************************************/