Opis forum
przykłady pochodzą ze strony https://computing.llnl.gov/tutorials/pthreads/#Mu
#include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; printf("Hello World! It's me, thread #%ld!\n", tid); pthread_exit(NULL); } int main (int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; for(t=0; t<NUM_THREADS; t++){ printf("In main: creating thread %ld\n", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); if (rc){ printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } } /* Last thing that main() should do */ pthread_exit(NULL); }
bardziej rozbudowany przykład
#include <iostream> #include "Kolejka.h" #include <pthread.h> #include <stdio.h> #include <ctime> #include <iostream> #include <cstdlib> #include <stdlib.h> using namespace std; #define KLIENT_NUMBER 7 #define MAX_COUNT 15 int ZamowienieID=1; int count=0; int flaga=0; pthread_mutex_t Signal_Mutex; pthread_attr_t attr; pthread_cond_t count_treshold_cv; void *KlientKeyboardTask(void *threadid) { long NumerWatku; NumerWatku = (long)threadid; int TypeOfProduct=-1; for(;;) { std::cout<<"\n\n\nWybierz produkt dla zamowienia klienta "<<NumerWatku<<"\n"; while(TypeOfProduct == -1) { std::cin>>TypeOfProduct; usleep(10); } std::cout<<"\n\n\Klient o ID: "<<NumerWatku<<"probuje zlozyc zamowienie\n\n\n"; Kolejka::GetKolejka()->wstaw_na_kon(NumerWatku,TypeOfProduct,&ZamowienieID); pthread_mutex_lock(&Signal_Mutex); pthread_cond_wait(&count_treshold_cv,&Signal_Mutex); Kolejka::GetKolejka()->usun_pierwszy(); cout<<"\n\n\t\t\t\t\t\t\t\t\t"<<NumerWatku<<" odebral swoje zamowienie\n\n"; TypeOfProduct=-1; pthread_mutex_unlock(&Signal_Mutex); } pthread_exit(NULL); } void *ProducentTask(void *threadid) { sleep(2); for(;;) { //std::cout<<"working"; while(Kolejka::GetKolejka()->pierwszy->produkt[4]==0 && Kolejka::GetKolejka()->pierwszy->produkt[5]==0) { pthread_mutex_lock(&Signal_Mutex); int NumerZamowienia = Kolejka::GetKolejka()->pobierz_pierwszy(1); int NumerKlienta = Kolejka::GetKolejka()->pobierz_pierwszy(2); int RodzajTowaru = Kolejka::GetKolejka()->pobierz_pierwszy(3); pthread_mutex_unlock(&Signal_Mutex); std::cout<<"\t\t\t\t\t\t\t\t\tProducent rozpoczyna realizacje za2mowienia ID: "<<NumerZamowienia<<"\n\t\t\t\t\t\t\t\t\tZamowienie klienta: "<<NumerKlienta<<" na towar: "<<RodzajTowaru<<"\n"; int CountLimit; switch(RodzajTowaru) { case 0: std::cout<<"\t\t\t\t\t\t\t\t\tWykonanie produktu zajmie okolo 300min\n";CountLimit=2;break; } Kolejka::GetKolejka()->pierwszy->produkt[4]=1; pthread_cond_signal(&count_treshold_cv); sleep(CountLimit); } } pthread_exit(NULL); } int main (int argc, char *argv[]) { pthread_t Klient[KLIENT_NUMBER]; pthread_t Producent; pthread_t KlientKeyboard; pthread_mutex_init(&Signal_Mutex, NULL); pthread_cond_init(&count_treshold_cv,NULL); pthread_attr_init(&attr); int rc; int rd; int re; for(long t=1; t<=KLIENT_NUMBER-1; t++) { //sleep(2); rc = pthread_create(&Klient[t],&attr, KlientTask, (void *)t); std::cout<<"Klient "<<t<<" gotowy do dzialania\n"; if (rc!=NULL) { std::cout<<"Bład podczas tworzenia klienta"<<t<<"funkcja zwraca wartosc"<<rc; } } rd=pthread_create(&Producent, &attr, ProducentTask, (void *)int(KLIENT_NUMBER+1)); if (rd!=NULL) { std::cout<<"Bład podczas tworzenia producenta funkcja zwraca wartosc"<<rd; } re=pthread_create(&KlientKeyboard, &attr, KlientKeyboardTask, (void *)KLIENT_NUMBER); if (re!=NULL) { std::cout<<"Bład podczas tworzenia klienta z obsluga klawiatury funkcja zwraca wartosc"<<re; } pthread_join(Producent,NULL); pthread_exit(NULL); }
Offline