Προς το περιεχόμενο

Condition vars se POSIX threads


Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παίδες θέλω λίγη βοήθεια σχετικά με ένα project που έχω. Πρόκειται για ενα theatre-reservation application. Είναι server-client.

 

Έχουμε 10 τηλεφωνητές οι οποίοι μπορούν να κλείνουν θέσεις ταυτόχρονα. Κάθε φορά που δημιουργείται ένας client δημιουργώ ένα thread και εκτελώ κάποιους υπολογισμούς.

Τώρα ποιο είναι το θέμα μου, πρέπει να μπορώ να εξυπηρετήσω μέχρι και 10 clients ταυτόχρονα. Όταν τελείωσει κάποιος client, αδειάζει ένας τηλεφωνητης και αρα συνδεέται σε αυτόν ο επόμενος client που περίμενε στην ουρά.

Ξέρω ότι πρέπει να χρησιμοποιήσω condition vars αλλά δεν ξέρω πως ακριβώς. Έχω σκαλώσει άσχημα.

 

Αυτό που θέλω να κάνω είναι

 

lock mutex()
counter++;
if(counter > 10)
 block thread() until an operator is free
else
 do computations
unlock mutex()

 

Όπου το counter αφορά τους τηλεφωνητές και το αρχικοποιώ σε 0.

 

 

  • Moderators
Δημοσ.

Θα μπορούσες όταν συνδέεται ένας client να ελέγχεις τον counter και αν είναι <10 τότε μόνο να δημιουργείς το thread, αλλιώς να τον βάζεις σε μια ουρά (πχ σε μια while counter < 10).

Δημοσ.

Ο γενικός σηματοφόρος δεν σε βολεύει ; :)


// main
sem_init(&sem,10);


// Every thread Pi

  // block if more than 10...
  sem_wait(&sem);

  // process

  // wake one from the queue
  sem_post(&sem);

 

 

Δημοσ.

Παίδες είναι project σχολής και πρέπει να το κάνουμε με mutex & cond vars.. Σημαφόρους χρησιμοποιούσαμε στο προηγούμενο project που ασχολούμασταν με διεργασίες :P

Δημοσ.

χρησιμοποίησε το σαν έναν triger, μόλις πέσει ο αριθμός των πελατών κάτω από το 10 να τριγκάρει κάτι κάπου με το condition var και να να δίνει το επόμενο πελάτη εφόσον είναι διαθέσιμος. Θεωρώ θα υπάρχει και σχετικό κλείδωμα με mutex για τον έλεγχο του αριθμού των πελατών....

Δημοσ.

Το πρόβλημα είναι το ίδιο με το "παραγωγός" - "καταναλωτής", αλλά για πολλούς καταναλωτές. 

 

 

Το βλέπεις από την μεριά του client... δες το από την μεριά του τηλεφωνητή. 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...