/******************************************************************************/ /** @file "Pthreads/C/Primer 3 - join/join.c" @brief Demonstracija upotrebe Pthread rutine join(). Ovaj primer korišćenjem Pthread join rutine pokazuje kako da se čeka da niti završe svoje izvršavanje. Kako neke od implementacija ne kreiraju niti u joinable stanju niti u ovom primeru su eksplicitno kreirane kao joinable kako bi kasnije mogle biti pridružene.@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 3 /******************************************************************************/ /** @brief Posao koji svaka od niti treba da odradi. @param null Generički pokazivac - očekuje se null. @return void* Rezultat izvršavanja rutine ptrhead_exit. U for petlji izračunava neku sumu. */ void* busy_work(void* null) { int i; double result = 0.0; for (i = 0; i < 1000000; i++) { result = result + (double) rand(); } printf("Thread result = %e\n", result); pthread_exit((void*) 0); } /******************************************************************************/ /** @brief Glavna nit programa. @param argc Broj argumenata komandne linije. @param argv Argumenti komandne linije. @return int Rezultat izvršavanja programa. Nakon inicijalizacije atributa i eksplicitnog postavljanja joinable atributa kreiramo @ref NUM_THREADS niti i za svaku pozovemo pthread_join rutinu. Poziv ove rutine za posledicu ima to da će glavna nit pre nego se ugasi čekati da sve ostale niti završe svoj posao. */ int main(int argc, char* argv[]) { pthread_t thread[NUM_THREADS]; pthread_attr_t attr; int rc, t, status; #ifdef WIN32 pthread_win32_process_attach_np(); #endif pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for (t = 0; t < NUM_THREADS; t++) { printf("Creating thread %d\n", t); rc = pthread_create(&thread[t], &attr, busy_work, NULL); if (rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } } pthread_attr_destroy(&attr); for (t = 0; t < NUM_THREADS; t++) { rc = pthread_join(thread[t], (void**) &status); if (rc) { printf("ERROR return code from pthread_join() is %d\n", rc); exit(-1); } printf("Completed join with thread %d status= %d\n", t, status); } pthread_exit(NULL); #ifdef WIN32 pthread_win32_process_detach_np(); #endif } /******************************************************************************/