- Lid geworden
- 3 jun 2008
- Berichten
- 12.887
- Karma
- 1.623
/* opzet opdracht 3 van IOSX1P1
** als vervolg op producent-consument probleem van opdracht 2
** 14 sept 2004 Harm Jongsma, John Visser
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define snelheid 2000000
#define NJOBS 10 // maximum aantal aan te maken printerthreads
void *gebr(void *args); // gebruikerthread
void *printeropdracht(void *p); // printeropdracht-thread
sem_t sem;
sem_t sem2;
sem_t rij;
struct printopdracht {
char filenaam[40]; // hoeft niet ingevuld
int gebrnummer; // nummer van de opdrachtgever
int opdrnummer; // printopdrachtnummer van deze opdrachtgever
int tijdsduur;
};
int volgendeprinter = 0; // welke printer als volgende aan de beurt is
int main() {
sem_init(&sem, 0, 1);
sem_init(&sem2,0,0);
sem_init(&rij, 0, 0);
int nr=1;
pthread_t t_gebruiker;
pthread_t t_gebruiker2;
srand48(500); //om random generator te starten
pthread_create(&t_gebruiker, NULL, gebr, &nr);
sem_wait(&sem2);
nr++;
pthread_create(&t_gebruiker2, NULL, gebr, &nr);
pthread_join(t_gebruiker, NULL);
pthread_join(t_gebruiker2, NULL);
return 0;
}
void *gebr(void *p) {
int i;
struct printopdracht opd;
pthread_t t_printer[NJOBS];
int *temp = (int*)p;
int gebr_nummer = *temp;
sem_post(&sem2);
for (i = 0; i < NJOBS; i++) {
sem_wait(&sem);
opd.gebrnummer = gebr_nummer; // nu staat het nummer van de gebruiker in de printopdracht
opd.opdrnummer = i + 1; // nummer van deze opdracht
opd.tijdsduur = snelheid*drand48(); // duur van de printjob
pthread_create(&t_printer, NULL, printeropdracht, &opd);
printf("printopdracht %2d verstuurd door gebruiker %d\n", opd.opdrnummer, opd.gebrnummer);
}
for (i=0; i<NJOBS; i++) {
sem_post(&rij);
pthread_join(t_printer, NULL);
}
}
void *printeropdracht(void *p) {
int hp=0; //huidige printer waar deze opdracht op gaat lopen
struct printopdracht *ptropdr = p;
struct printopdracht ptrodr = *((struct printopdracht*)p);
printf("printopdracht %2d ontvangen van gebruiker %d\n",ptrodr.opdrnummer, ptrodr.gebrnummer);
sem_post(&sem);
sem_wait(&rij);
printf("begin printopdracht: gebrnr: %2d opdrnr: %2d printernr: %2d\n",ptrodr.gebrnummer, ptrodr.opdrnummer, hp);
usleep(ptropdr->tijdsduur);
printf("einde printopdracht: gebrnr: %2d opdrnr: %2d printernr: %2d\n",ptrodr.gebrnummer, ptrodr.opdrnummer, hp);
}
** als vervolg op producent-consument probleem van opdracht 2
** 14 sept 2004 Harm Jongsma, John Visser
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define snelheid 2000000
#define NJOBS 10 // maximum aantal aan te maken printerthreads
void *gebr(void *args); // gebruikerthread
void *printeropdracht(void *p); // printeropdracht-thread
sem_t sem;
sem_t sem2;
sem_t rij;
struct printopdracht {
char filenaam[40]; // hoeft niet ingevuld
int gebrnummer; // nummer van de opdrachtgever
int opdrnummer; // printopdrachtnummer van deze opdrachtgever
int tijdsduur;
};
int volgendeprinter = 0; // welke printer als volgende aan de beurt is
int main() {
sem_init(&sem, 0, 1);
sem_init(&sem2,0,0);
sem_init(&rij, 0, 0);
int nr=1;
pthread_t t_gebruiker;
pthread_t t_gebruiker2;
srand48(500); //om random generator te starten
pthread_create(&t_gebruiker, NULL, gebr, &nr);
sem_wait(&sem2);
nr++;
pthread_create(&t_gebruiker2, NULL, gebr, &nr);
pthread_join(t_gebruiker, NULL);
pthread_join(t_gebruiker2, NULL);
return 0;
}
void *gebr(void *p) {
int i;
struct printopdracht opd;
pthread_t t_printer[NJOBS];
int *temp = (int*)p;
int gebr_nummer = *temp;
sem_post(&sem2);
for (i = 0; i < NJOBS; i++) {
sem_wait(&sem);
opd.gebrnummer = gebr_nummer; // nu staat het nummer van de gebruiker in de printopdracht
opd.opdrnummer = i + 1; // nummer van deze opdracht
opd.tijdsduur = snelheid*drand48(); // duur van de printjob
pthread_create(&t_printer, NULL, printeropdracht, &opd);
printf("printopdracht %2d verstuurd door gebruiker %d\n", opd.opdrnummer, opd.gebrnummer);
}
for (i=0; i<NJOBS; i++) {
sem_post(&rij);
pthread_join(t_printer, NULL);
}
}
void *printeropdracht(void *p) {
int hp=0; //huidige printer waar deze opdracht op gaat lopen
struct printopdracht *ptropdr = p;
struct printopdracht ptrodr = *((struct printopdracht*)p);
printf("printopdracht %2d ontvangen van gebruiker %d\n",ptrodr.opdrnummer, ptrodr.gebrnummer);
sem_post(&sem);
sem_wait(&rij);
printf("begin printopdracht: gebrnr: %2d opdrnr: %2d printernr: %2d\n",ptrodr.gebrnummer, ptrodr.opdrnummer, hp);
usleep(ptropdr->tijdsduur);
printf("einde printopdracht: gebrnr: %2d opdrnr: %2d printernr: %2d\n",ptrodr.gebrnummer, ptrodr.opdrnummer, hp);
}