Also wir haben ein basis Programm gegeben und sollen mit Semaphore dafür sorgen, dass der kritische Bereich gehandled wird.
Meiner Meinung nach ist der kritische Bereich z.B. das ein oder ausfahren beim Parkhaus. Weitere sind mir nicht eingefallen xD
Hier ist das Base-Code:
Und hier ist meine leicht angepasste Version:
Meiner Meinung nach ist der kritische Bereich z.B. das ein oder ausfahren beim Parkhaus. Weitere sind mir nicht eingefallen xD
Hier ist das Base-Code:
C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define AUTOS 500
#define PLATZ 100
#define TIME 4
// gemeinsame Variablen
pthread_t th[AUTOS];
pthread_t infoID;
int parkplaetze[PLATZ];
int anzahl = 0;
// Thread-Funktion - Autos
void* auto_thread()
{
// Zufallszahlengenerator initialisieren
srand((unsigned) pthread_self());
while(1) {
if(anzahl < PLATZ) { // Es ist noch Platz im Parkhaus
anzahl++;
// Platz waehlen
int pn = 0;
while (parkplaetze[pn] != 0) {
pn = rand() % PLATZ;
}
parkplaetze[pn] = 1;
// Parken
int ri = rand();
sleep(ri % TIME + 1);
// Parkhaus verlassen
parkplaetze[pn] = 0;
anzahl--;
pthread_exit(NULL);
}
}
}
void* info (void *name) {
int j,k;
while(1) {
for(j = 0; j < PLATZ; j++) {
if(parkplaetze[j] != 0) {
printf("X");
}else{
printf("-");
}
}
printf("\n");
printf("Anzahl der freien Plätze im Parkhaus: %3d \n\n", PLATZ-anzahl);
// sleep(1);
}
}
int main() {
int i = 0;
// Alle Parkplaetze sind am Anfang leer
for(i = 0; i < PLATZ; i++) {
parkplaetze[i] = 0;
}
// Thread mit Info-Anzeige starten
pthread_create(&infoID,NULL, info, NULL);
// Autos starten
for(i = 0; i < AUTOS; i++) {
if(pthread_create(&th[i],NULL, auto_thread, NULL))
{ fprintf(stderr, " Fehler beim Erzeugen des Threads %d\n", i);
return(0);
}
}
// Warten bis alle Autos das Parkhaus verlassen haben
for(i = 0; i < AUTOS; i++) {
pthread_join(th[i], NULL);
}
printf("Alle Autos haben das Parkhaus verlassen.\n");
return 0;
}
Und hier ist meine leicht angepasste Version:
C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define AUTOS 500
#define PLATZ 100
#define TIME 4
// gemeinsame Variablen
pthread_t th[AUTOS];
pthread_t infoID;
int parkplaetze[PLATZ];
int anzahl = 0;
sem_t manager;
// Thread-Funktion - Autos
void* auto_thread(){
// Zufallszahlengenerator initialisieren
srand((unsigned) pthread_self());
sem_wait(&manager);
anzahl++;
// Platz waehlen
int pn = 0;
while (parkplaetze[pn] != 0) {
pn = rand() % PLATZ;
}
parkplaetze[pn] = 1;
// Parken
int ri = rand();
sleep(ri % TIME + 1);
// Parkhaus verlassen
sem_post(&manager);
parkplaetze[pn] = 0;
anzahl--;
pthread_exit(NULL);
}
void* info (void *name) {
int j,k;
while(1) {
for(j = 0; j < PLATZ; j++) {
if(parkplaetze[j] != 0) {
printf("X");
}else{
printf("-");
}
}
printf("\n");
printf("Anzahl der freien Plätze im Parkhaus: %3d \n\n", PLATZ-anzahl);
// sleep(1);
}
}
int main() {
int i = 0;
// Alle Parkplaetze sind am Anfang leer
for(i = 0; i < PLATZ; i++) {
parkplaetze[i] = 0;
}
//Initilize Semaphore for ParkManagement
sem_init(&manager, 0, 100);
// Thread mit Info-Anzeige starten
pthread_create(&infoID,NULL, info, NULL);
// Autos starten
for(i = 0; i < AUTOS; i++) {
if(pthread_create(&th[i],NULL, auto_thread, NULL)){
fprintf(stderr, " Fehler beim Erzeugen des Threads %d\n", i);
return(0);
}
}
// Warten bis alle Autos das Parkhaus verlassen haben
for(i = 0; i < AUTOS; i++) {
pthread_join(th[i], NULL);
}
printf("Alle Autos haben das Parkhaus verlassen.\n");
return 0;
}