/******************************************************************************/
/**
@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
}
/******************************************************************************/