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