/******************************************************************************/ /** @file "Pthreads/C/Primer 1 - argument/pthread_argument_passing_hello_0.c" @brief Prosledjivanje jednog argumenta nitima za vreme njihovog kreiranja. "Hello World" program koji korićenjem POSIX Threads API-ja demonstrira jedan od bezbednih načina za prosledjivanje argumenata nitima tokom njihovog kreiranja. Autor ovog primera je Blaise Barney. Kod je preuzet iz Pthreads tutorijala sa adrese http://www.llnl.gov/computing/tutorials/pthreads/ i prilagoden potrebama ovog kursa. */ /******************************************************************************/ #include #include #include /******************************************************************************/ /** @def NUM_THREADS @brief Broj niti koje treba kreirati. */ #define NUM_THREADS 9 /******************************************************************************/ /** @var messages @brief Niz poruka koje će se ispisivati. */ char* messages[NUM_THREADS]; /******************************************************************************/ /** @brief Posao koji svaka od niti treba da obavi. @param thread_id Generički pokazivač na ID broj niti. @return void* Rezultat izvršenja funkcije. Svaka nit će u zavisnosti od vrednosti argumenta koji joj je prosledjen ispisati odgovarajuću poruku na standardnom izlazu. */ void* print_hello(void* thread_id) { int* id_ptr, task_id; //sleep(1); id_ptr = (int*) thread_id; task_id = *id_ptr; printf("Thread %d: %s\n", task_id, messages[task_id]); pthread_exit(NULL); } /******************************************************************************/ /** @brief Glavna nit programa. @param argc Broj argumenata komandne linije. @param argv Argumenti komandne linije. @return int Rezultat izvršenja programa. U glavnom programu kreiramo @ref NUM_THREADS niti i u toku kreiranja svakoj od njih kao argument prosledimo generički pokazivač na njen ID. */ int main(int argc, char* argv[]) { pthread_t threads[NUM_THREADS]; int* task_ids[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++) { // U svakom ciklusu kreiramo po jednu nit sa odgovarajucim ID brojem. task_ids[t] = (int*) malloc(sizeof(int)); *task_ids[t] = t; printf("Creating thread %d\n", t); // Prilikom kreiranja niti kao argumente pthread_create metode prosledjujemo // pokazivac na deskriptor niti, set atributa niti, identifikator // funkcije koju nit treba da izvrsi i argumente te funkcije rc = pthread_create(&threads[t], NULL, print_hello, (void*) task_ids[t]); // Ukoliko je doslo do grese prilikom kreiranja niti ispisemo podatke o gresci // i nasilno prekinemo izvrsavanje programa. 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 } /******************************************************************************/