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

Δημιουργία πολλών διεργασιών


AfterForever

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

Έχω Ν παιδιά. Το πρώτο παιδί κάνει κάνει 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() και να κολλάει εκεί φυσικά.

Τα της κοινής μνήμης / σημαφόρων είναι σωστά, τα έχω χιλιοελέγξει.

Τι μπορεί να φταίει; Σαν από ένα σημείο και πέρα να μη συννενοούνται σωστά...

Κάθε βοήθεια ευπρόσδεκτη

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 30
  • Δημ.
  • Τελ. απάντηση

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.


  • Δημιουργία νέου...