Commit 986611ec authored by Dong Hung Pham's avatar Dong Hung Pham 🤡
Browse files

update semaphore instead busy waiting.

Hier musste ich die semaphore nicht dynamisch erzeugen weil bei mir es immer komische Fehler gibt.
parent af67f823
......@@ -20,6 +20,8 @@ sem_t semaphoreVerkauferReihe; //um zu kontrollieren , die genaue reihe von ver
sem_t sem0;sem_t sem1;sem_t sem2;sem_t sem3;sem_t sem4;sem_t sem5;sem_t sem6;sem_t sem7;// es gibt immer Fehler wenn ich mit dynamische Erzeugung arbeitet
std::vector<sem_t> listSem;// here asume we ,that maximal 8 verkaufer gibt , es gibt nur 4 zutaten, deshalb ist 4 verkaufer ist ideale Arbeitumgebung
sem_t sem01;sem_t sem11;sem_t sem21;sem_t sem31;sem_t sem41;sem_t sem51;sem_t sem61;sem_t sem71;// es gibt immer Fehler wenn ich mit dynamische Erzeugung arbeitet
std::vector<sem_t> listSem2;// here asume we ,that maximal 8 verkaufer gibt , es gibt nur 4 zutaten, deshalb ist 4 verkaufer ist ideale Arbeitumgebung
// every CS has a mutex
pthread_mutex_t Sauce= PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t Brot= PTHREAD_MUTEX_INITIALIZER;
......@@ -127,7 +129,7 @@ void *verkaufen(void *tid) {
printf("creat verkauferrrrr%ld\n",(long)tid);
sem_post(&semaphoreVerkauferReihe);
while (nichtFertig) {
while (!vectorCondition[(long)tid]) { // that can we use semaphore instead
sem_wait(&listSem2[(long)tid]);// that can we use semaphore instead
int max = 3;
int num;
for (int c = 0; c <= max; c++){
......@@ -142,7 +144,7 @@ sem_post(&semaphoreVerkauferReihe);
printf("Doener fertig verkaufer Thread No: %ld fuer kunde :%d , with time%ld \n ",(long)tid,vectorKundenBestellung[(long)tid].back(),(long)num);
sem_post(&listSem[(long)tid]);//go get ur bestellung mtf
}
}
pthread_exit(NULL);
}
......@@ -175,6 +177,7 @@ for (int i=0;i<m;i++) {
sem_post(&semaphoreKundenReihe);
printf("kunden Thread No: %ld\n",(long)tid);
vectorKundenBestellung[i].push_back((long)tid);//long(tid) kunde come and orde at (i) verkaufer
sem_post(&listSem2[i]);
vectorCondition[i] = 1;//to announce , that thread verkaufer (i) got a job
sem_wait(&listSem[i]);// mwait verkaufer wake up
......@@ -222,7 +225,7 @@ std::cout << "ENDDDDDDDDD" << std::endl;
}
//imbiss <m> <n> <r> <k> <t>
// g++ 2.cpp -o 2 -pthread
// 6 doener 1 sec 4 verkaufer,5 mit 3
int main(int argc,char* argv[]) {
// k = 14;m=3;
// t = 50000;
......@@ -234,6 +237,8 @@ int main(int argc,char* argv[]) {
nSauce = n;nBrot =n;nFleisch=n;nSalat = n;
sem_init(&sem0, 0, 0);sem_init(&sem1, 0, 0);sem_init(&sem2, 0, 0);sem_init(&sem3, 0, 0);sem_init(&sem4, 0, 0); //init sem
listSem.push_back(sem0);listSem.push_back(sem1);listSem.push_back(sem2);listSem.push_back(sem3);listSem.push_back(sem4);
sem_init(&sem01, 0, 0);sem_init(&sem11, 0, 0);sem_init(&sem21, 0, 0);sem_init(&sem31, 0, 0);sem_init(&sem41, 0, 0); //init sem
listSem2.push_back(sem01);listSem2.push_back(sem11);listSem2.push_back(sem21);listSem2.push_back(sem31);listSem2.push_back(sem41);
sem_init(&semaphoreVerkauferReihe, 0, 1);
init_verkaufer(m);
sem_init(&semaphoreVerkaufer, 0, m);
......
  • @l.burchard ich hab schon verbessert.

  • Hallo Herr Pham,

    das ist nicht gut gelöst:

    1. Sie haben eine feste Anzahl Semaphore in eine Warteschlange gestellt. Das sollte auf jeden Fall zumindest so geändert werden, dass auch die korrekte Anzahl gemäß der eingebenen Parameter in der Warteschlange landet
    2. Es ist nicht gut, Semaphore zu kopieren, d.h. so wie in Ihrem Code den Semaphor in die Datenstruktur vom Typ std::vector<sem_t> zu kopieren. Stattdessen sollte ein Zeiger kopiert werden.

    Mit freundlichen Grüßen

    Lars-Olof Burchard

Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment