Threads || Prozesse & Semaphoren

P

Pliskin88

Grünschnabel
Hallo,
ich muss für die Schule eine simulation programmieren.
Es handelt um diese Problemstellung:

"Simulieren sie eine Mautstelle mit zwei kassen. Sobald eine kasse frei wird, darf ein Auto zur Kasse fahren.
Die Autos können entweder als Prozesse (fork) oder als Threads realisiert werden"

Ich hab das Programm soweit geschrieben, sodass es für eine Kasse gilt.
Auto (Thread) fährt in die Kasse dann wird die kasse locked und danach wieder entlocked.
Aber, da es 2 Kassen sind, verzweifle ich hier etwas.
Wie kann ich denn abfragen, welche kasse gerade nicht locked ist? Und wenn ich das herauskriege, wie sag ich dem Thread, dass er diese Funktion(kasse) benutzen soll und nicht die andere???

Ich bin über jede Gedankenstütze oder Pseudo codes oder sonstige Hilfe dankbar.
Ich bin in dem gebiet leider noch ein Neuling und kenne mich nicht so aus.
Google hilft da auch nicht viel weiter, weil ich da nur die Grundlagen finde.

Liebe Grüße und einen schönen Tag noch
 
Hi,

also wenn du die Aufgabe mit (P-)Threads lösen willst, kannst du dir die Nutzung von Condition Variables (z.B. https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables) anschauen. Nach einem Aufruf der Methode pthread_cond_wait() wartet ein Thread solange, bis ihm von einem anderen Thread durch pthread_cond_signal() signalisiert wird, dass er weiterlaufen soll. Wäre also für deine Aufgabe interessant.

P.S. Im OpenBook "The Little Book of Semaphores" (http://www.greenteapress.com/semaphores/ finden sich viele weitere interessante Concurrency-Probleme und deren Lösungen.
 
hey, wow das könnte mir weiterhelfen danke *les*

NOch eine frage:
Gibt es eine Funktion, die man abfragen kann, ob ein Semaphor gerade frei ist oder nicht?
 
Dafür gibt es die Funktion:
Code:
int sem_getvalue(sem_t *sem, int *valp);
Vorsicht: Der Rückgabewert gibt nur Erfolg(0) oder Fehlschlag(-1) an, der Wert der Semaphore wird an die Position des valp Pointers geschrieben.

Gruß,
baggio
 
Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <pthread.h>

pthread_mutex_t mutex1, mutex2;

void *kasse1(void *dummy)
{
   pthread_mutex_lock(&mutex1);
   printf("Kasse_1 bezahlt!");
   pthread_mutex_unlock(&mutex1);
   return NULL;
}

void *kasse2(void *dummy)
{
   pthread_mutex_lock(&mutex2);
   printf("Kasse_2 bezahlt!");
   pthread_mutex_unlock(&mutex2);
   return NULL;
}

int main()
{
  int dummy;
  pthread_t p1,p2;
  pthread_mutex_init(&mutex1,NULL);
  pthread_mutex_init(&mutex2,NULL);

  pthread_create(&p1, NULL, kasse1, &dummy);
  pthread_create(&p1, NULL, kasse2, &dummy);

  pthread_join (p1, NULL);
  pthread_join (p2, NULL);

  return 0;
}

Habe es jetzt soweit programmiert...Aber weiter komme ich einfach nicht.
Wie soll ich dem Thread sagen, dass, wenn zb kasse_1 schon besetzt ist, er die zweite kasse benutzen soll.
 
Servus,

ich würde nach der Aufgabenstellung etwas anders an die Aufgabe herangehen. Meiner Meinung nach wird hier nach einer Lösung für ein Producer-Consumer Problem gesucht. Die beiden Threads kasse1 und kasse2 entsprechen dabei den Consumern. Wenn du noch einen Thread hinzufügst, der eine Queue(z.B. eine verkettete Liste, für eine erste Implementierung reicht aber bestimmt auch ein Array) mit Einträgen (Autos) füllt, wäre das der Producer. Dieser würde simulieren, wie sich Autos in die Schlange einreihen.

Die Consumer müssen dann den Zugriff auf die Queue sperren. Wenn sich dabei Einträge in der Queue befinden, entfernen sie den ersten Eintrag und fahren fort. Wenn die Queue leer ist, müssen der Consumer so lange blockieren, bis er vom Producer ein pthread_cond_signal() empfängt, damit er weiss, das sich wieder mindestens ein Eintrag in der Liste befindet.

Gruß,
baggio
 
Zurück
Oben