AfterForever Δημοσ. 11 Δεκεμβρίου 2007 Μέλος Δημοσ. 11 Δεκεμβρίου 2007 Έχω Ν παιδιά. Το πρώτο παιδί κάνει κάνει pause() και περιμένει ένα παιδί από τα επόμενα να του στείλει signal, ώστε κάνει ό,τι είναι να κάνει και μετά κάνει up τον σημαφόρο. Αντίστοιχα, τα υπόλοιπα παιδιά κάνουν down το σημαφόρο και στέλνουν σήμα στο 1ο παιδί, για να κάνει ό,τι είναι να κάνει. Η λογική είναι ότι τα παιδιά κάνουν down το σημαφόρο, γράφουν στην κοινή μνήμη και στέλνουν σήμα στο πρώτο παιδί, γράφει και αυτό και μετά κάνει up, ώστε το παιδί που έχει γίνει blocked να κάνει το ίδιο. Το πρόγραμμα παίρνει σαν ορίσματα τον αριθμό των παιδιών (N) και το πόσες φορές πρέπει να γίνει αυτό. > for(i=0;i<=n;i++){ if( ( (pid = fork() ) ) == 0 ){ pids[i]=getpid(); if(i==0){ //first child int metritis=0; while(metritis<(n*y)){ //code() //sem up metritis++; } break; } if(i>0 && i<=n){ //the rest int x=0; while(x < y){ //sem down; //code(); //send signal to pids[0] x++; break; } } } } Για μικρά ορίσματα (n=4, y=10) δουλεύει τις περισσότερες φορές. Η λογική σειρά που γίνεται μέσω εκτυπώσεων είναι κάπως έτσι : > Παιδί 0 πριν το pause Παιδί [1-ν] κάνει down Παιδί [1-ν] στέλνει σήμα Παιδί 0 μετά το pause Παιδί 0 γράφει Παιδί 0 κάνει up Παιδί 0 πριν το pause Παιδί [1-ν] κάνει down Παιδί [1-ν] στέλνει σήμα Παιδί 0 μετά το pause .... Το θέμα είναι πολλές φορές, ένα παιδί [1-ν] κάνει down το σημαφόρο και στέλνει σήμα στο παιδί 0 πριν αυτό κάνει up το σημαφόρο, με αποτέλεσμα μετά να γίνεται pause() και να κολλάει εκεί φυσικά. Τα της κοινής μνήμης / σημαφόρων είναι σωστά, τα έχω χιλιοελέγξει. Τι μπορεί να φταίει; Σαν από ένα σημείο και πέρα να μη συννενοούνται σωστά... Κάθε βοήθεια ευπρόσδεκτη
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.