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