1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
|
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#define BUFFER_SIZE 24
//benötigte semaphoren
sem_t empty;
sem_t server;
sem_t desktoprechner;
sem_t monitor;
pthread_mutex_t mutex;
pthread_attr_t attr;
pthread_t ptid,dtid,stid; //Threads für 3 Prozesse
void *producerH(void *param);
void *consumerD(void *param);
void *consumerS(void *param);
int serverCount=0;
int desktoprechnerCount=0;
int monitorCount=0;
int criticalSectionCountH=0;
int criticalSectionCountD=0;
int criticalSectionCountS=0;
int main()
{
//semaphoren initialisieren
pthread_mutex_init(&mutex, NULL);
pthread_attr_init(&attr);
sem_init(&server, 0, 0);
sem_init(&desktoprechner, 0, 0);
sem_init(&monitor, 0, 0);
sem_init(&empty, 0, BUFFER_SIZE);
//Threads erstellen
pthread_create(&ptid, &attr, producerH, NULL);
pthread_create(&dtid, &attr, consumerD, NULL);
pthread_create(&stid, &attr, consumerS, NULL);
//darauf warten, dass die Threads fertig sind
pthread_join(ptid,NULL);
pthread_join(dtid,NULL);
pthread_join(stid,NULL);
printf("%d mal im kritischen Bereich des Herstellers gewesen\n", criticalSectionCountH);
printf("%d mal im kritischen Bereich des Techniker D gewesen\n", criticalSectionCountD);
printf("%d mal im kritischen Bereich des Techniker S gewesen\n", criticalSectionCountS);
return 0;
}
void *producerH(void *param)
{
while(1)
{
int i;
for(i=0;i<6;i++)
sem_wait(&empty);
pthread_mutex_lock(&mutex);
criticalSectionCountH++;
serverCount++;
desktoprechnerCount = desktoprechnerCount + 3;
monitorCount = monitorCount + 2;
printf("%d Server entladen\n",serverCount);
printf("%d desktoprechner entladen\n",desktoprechnerCount);
printf("%d Monitore entladen\n",monitor);
pthread_mutex_unlock(&mutex);
sem_post(&server);
sem_post(&desktoprechner);
sem_post(&desktoprechner);
sem_post(&desktoprechner);
sem_post(&monitor);
sem_post(&monitor);
}
}
void *consumerD(void *param)
{
while(1)
{
sem_wait(&desktoprechner);
sem_wait(&monitor);
pthread_mutex_lock(&mutex);
criticalSectionCountD++;
monitorCount--;
desktoprechnerCount--;
printf("%d desktoprechner beladen\n",desktoprechnerCount);
printf("%d Monitore beladen\n",monitor);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
sem_post(&empty);
}
}
void *consumerS(void *param)
{
while(1)
{
sem_wait(&server);
pthread_mutex_lock(&mutex);
criticalSectionCountS++;
serverCount--;
printf("%d Server beladen\n",serverCount);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
}
|