/******************************************************************************/ /** @file pthread_argument_passing_hello_2.c @brief Primer nebezbednog prosledjivanja argumenta nitima za vreme njihovog kreiranja. "Hello World" program koji korišćenjem POSIX Threads API-ja demonstrira loš način za prosledjivanje argumenata nitima tokom njihovog kreiranja. U ovom slučaju promenljiva argument je promenjena od strane glavne niti jer služi i dalje u kreiranju drugih niti.@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 Posao koji svaka od niti treba da odradi. @param thread_id Generički pokazivač na strukturu tipa thread_data @return void* Rezultat izvršavanja funkcije. Nakon budjenja svaka od niti ce u zavisnosti od vrednosti argumenta ispisati odgovarajuću poruku. */ void* print_hello(void* thread_id) { int* id_ptr, task_id; //sleep(3); id_ptr = (int*) thread_id; task_id = *id_ptr; printf("Thread %d: %s \n", task_id, messages[task_id]); pthread_exit(NULL); } /******************************************************************************/ /** @brief Glavni program. @param argc Broj argumenata komandne linije. @param argv Argumenti komandne linije. @return int Status izvršenja programa. Glavni program kreira @ref NUM_THREADS niti i prilikom kreiranja svakoj kao argument prosledjuje adresu brojača @c t koji će niti iskoristiti za izvršenje zadatog posla. Ovaj način prosledjivanja argumenata po referenci je nebezbedan pošto se u konkretnom slučaju u glavnom programu brojač inkrementira po zavrsetku svakog ciklusa for petlje. */ int main(int argc, char* argv[]) { pthread_t threads[NUM_THREADS]; int rc, t; #ifdef WIN32 pthread_win32_process_attach_np(); #endif 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++) { printf("Creating thread %d\n", t); rc = pthread_create(&threads[t], NULL, print_hello, (void*) &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 } /******************************************************************************/