/******************************************************************************/
/**
@file "Pthreads/C/Primer 1 - argument/pthread_argument_passing_hello_1.c"
@brief Nacin prosledjivanja vise argumenata nitima za vreme njihovog kreiranja.
"Hello World" program koji korišćenjem POSIX Threads API-ja demonstrira još
jedan od bezbednih načina za prosledjivanje argumenata nitima tokom
njihovog kreiranja. U ovom slučaju koristimo strukturu kako bi prosledili
veći broj argumenata.@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 Struktura argumenata koje ćemo prosledjivati nitima
*/
struct thread_data
{
/**
@brief ID broj niti.
*/
int thread_id;
/**
@brief Suma brojača.
*/
int sum;
/**
@property message
@brief Poruka koju nit treba da ispiše.
*/
char* message;
};
/******************************************************************************/
/**
@brief Niz od @ref NUM_THREADS globalnih promenljivih tipa thread_data
*/
struct thread_data thread_data_array[NUM_THREADS];
/******************************************************************************/
/**
@brief Posao koji svaka od niti treba da odradi
@param thread_arg Generički pokazivač na strukturu tipa thread_data
@return void* Rezultat izvršavanja funkcije
Nakon budjenja svaka od niti će u zavisnosti od vrednosti polja
prosledjenog argumenta ispisati poruku koja će sadržati broj niti,
pozdravnu poruku na odgovarajućem jeziku i sumu brojača.
*/
void* print_hello(void* thread_arg)
{
int task_id, sum;
char* hello_msg;
struct thread_data* my_data;
//sleep(1);
my_data = (struct thread_data*) thread_arg;
task_id = my_data->thread_id;
sum = my_data->sum;
hello_msg = my_data->message;
printf("Thread %d: %s Sum=%d\n", task_id, hello_msg, sum);
pthread_exit(NULL);
}
/******************************************************************************/
/**
@brief Glavna nit programa.
@param argc Broj argumenata komandne linije.
@param argv Argumenti komandne linije.
@return Vraća status izvršenja programa.
Glavni program kreira @ref NUM_THREADS niti i prilikom kreiranja svakoj
prosledjuje pokazivač na strukturu podataka tipa thread_data koji će niti
iskoristiti za izvršenje zadatog posla.
*/
int main(int argc, char* argv[])
{
pthread_t threads[NUM_THREADS];
int rc, t, sum;
#ifdef WIN32
pthread_win32_process_attach_np();
#endif
sum=0;
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++)
{
sum = sum + t;
thread_data_array[t].thread_id = t;
thread_data_array[t].sum = sum;
thread_data_array[t].message = messages[t];
printf("Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, print_hello, (void*)
&thread_data_array[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
}
/******************************************************************************/