gamingrig Δημοσ. 8 Μαΐου 2020 Δημοσ. 8 Μαΐου 2020 SOS ΑΠΛΑ ΧΩΡΙΣ ΘΕΩΡΙΑ Η ΕΡΓΑΣΙΑ ΜΟΥ ΤΕΘΗΚΕ ΑΠΟ ΤΗΝ ΔΕΥΤΕΡΑ ΕΩΣ ΤΗΝ ΠΑΡΑΣΚΕΥΗ ΤΑ ΜΕΣΑΝΥΧΤΑ . ΕΧΩ ΤΡΕΛΑΘΕΙ ΝΑ ΨΑΧΝΩ ΕΣΤΩ ΘΕΩΡΙΑ ΓΙΑ ΝΑ ΔΙΑΒΑΣΩ ΝΑΤΗΝ ΛΥΣΩ ΕΧΩ ΤΡΕΛΑΘΕΙ. Γράψτε ένα πρόγραμμα σε C το οποίο να υπολογίζει «παράλληλα» το εσωτερικό γινόμενο δύο διανυσμάτων Α και Β (a1b1+a2b2+……+anbn) [με τη βοήθεια ‘p’ threads όπου το κάθε thread θα υπολογίζει το επιμέρους άθροισμα ‘n/p’ όρων (επιμέρους γινομένων) – τα p, n, ai και bi θα πρέπει να τα δίνει ο χρήστης ή να τα διαβάζετε από αρχείο – επίσης θεωρείστε ότι το ‘n’ είναι ακέραιο πολλαπλάσιο του ‘p’]. Πιο συγκεκριμένα, το κάθε thread θα πρέπει (α) να υπολογίζει τοπικά (σε μια τοπική μεταβλητή – π.χ. local_sum) τo επιμέρους άθροισμα που του αναλογεί και (β) να ενημερώνει στο τέλος με το τοπικό του άθροισμα μια κοινή μεταβλητή (π.χ. total_sum) η οποία θα αντιπροσωπεύει το τελικό άθροισμα (εσωτερικό γινόμενο). Το τελικό αυτό άθροισμα θα πρέπει στο τέλος να τυπώνεται στην οθόνη. Υπάρχει κάπου κρίσιμο τμήμα/κώδικας που απαιτεί προστασία (αμοιβαίο αποκλεισμό) ? Αν ναι, γράψτε επιπλέον τον κώδικα για να προστατευθεί το κρίσιμο αυτό τμήμα (Ι) με χρήση του μηχανισμού ‘κλειδώματος’ που παρέχουν τα POSIX Threads και (ΙΙ) με χρήση POSIX semaphores. ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ ΟΛΟΥΣ ΕΣΤΩ ΚΑΙ ΑΝ ΜΠΕΙΚΑΤΕ ΝΑ ΔΕΙΤΕ ΤΟ ΠΟΣΤ ΟΠΟΙΑΔΗΠΟΤΕ ΣΥΜΒΟΥΛΗ ΕΥΠΡΟΣΔΕΚΤΗ!
GReaperEx Δημοσ. 8 Μαΐου 2020 Δημοσ. 8 Μαΐου 2020 Αναφορά σε κείμενο ΕΧΩ ΤΡΕΛΑΘΕΙ ΝΑ ΨΑΧΝΩ ΕΣΤΩ ΘΕΩΡΙΑ ΓΙΑ ΝΑ ΔΙΑΒΑΣΩ ΝΑΤΗΝ ΛΥΣΩ ΕΧΩ ΤΡΕΛΑΘΕΙ. Τι έχεις κάνει λοιπόν μέχρι τώρα? 1
gamingrig Δημοσ. 8 Μαΐου 2020 Μέλος Δημοσ. 8 Μαΐου 2020 3 ώρες πριν, GReaperEx είπε Τι έχεις κάνει λοιπόν μέχρι τώρα? #include <stdio.h> #include <stdlib.h> #include <pthread.h> int p; void *add(int *a, int *b, int *c,int n, void *arg) {int i,j,start,end,lines; int id=(int)arg; lines=n/p; start=id *lines; end=start + lines; for(i=start; i<end; i++){ c=b*c; }return NULL; } int main(int argc, char * argv[]) { int i,n; pthread_t *tid; if(argc<2){ printf("Provide number of threads\n"); exit(1); } else if(argc<3){ printf("Provide n\n"); exit(2); } p=atoi(argv[1]); n=atoi(argv[2]); int *A=(int *)malloc(n*sizeof(int)); int *B=(int *)malloc(n*sizeof(int)); int *C=(int *)malloc(n*sizeof(int)); tid=(pthread_t *)malloc(p*sizeof(pthread_t)); if(tid==NULL || A==NULL || B==NULL || C==NULL) {printf("Could not allocate memory\n"); exit(1); } for(i=0;i<p;i++){ pthread_create(&tid,NULL,add(A,B,C,n,(void *) i),(void *)i); } for(i=0;i<p;i++) { pthread_join(tid,NULL); } for(i=0;i<n;i++) {printf("%d\n", C);} return 0; }
Ponous Δημοσ. 8 Μαΐου 2020 Δημοσ. 8 Μαΐου 2020 Σου στέλνω σε πμ κάποιες διαλέξεις που έχουν παραδείγματα για posix threads. Καλύπτουν μέχρι τα mutexes και ίσως και τα barriers. Είναι με παραδείγματα βήμα βήμα και καλύπτουν όσα χρειάζεσαι. Μερικές παρατηρήσεις που ίσως δεν τις βρεις με την πρώτη ματιά στις διαλέξεις όμως: to include προτίμησε να είναι πάντα η πρώτη βιβλιοθήκη που γίνεται import. Κάποιοι compilers crasharoun To i στο for, προτίμησε να είναι long όταν κάνεις create threads Τα δεδομένα σου καλύτερα να τα περνάς ως struct Τα υπόλοιπα νομίζω θα τα βρεις εύκολα σε αυτό που σου στέλνω 1
gamingrig Δημοσ. 8 Μαΐου 2020 Μέλος Δημοσ. 8 Μαΐου 2020 1 λεπτό πριν, Ponous είπε Σου στέλνω σε πμ κάποιες διαλέξεις που έχουν παραδείγματα για posix threads. Καλύπτουν μέχρι τα mutexes και ίσως και τα barriers. Είναι με παραδείγματα βήμα βήμα και καλύπτουν όσα χρειάζεσαι. Μερικές παρατηρήσεις που ίσως δεν τις βρεις με την πρώτη ματιά στις διαλέξεις όμως: to include προτίμησε να είναι πάντα η πρώτη βιβλιοθήκη που γίνεται import. Κάποιοι compilers crasharoun To i στο for, προτίμησε να είναι long όταν κάνεις create threads Τα δεδομένα σου καλύτερα να τα περνάς ως struct Τα υπόλοιπα νομίζω θα τα βρεις εύκολα σε αυτό που σου στέλνω Σε ευχααριστω παρα παρααα πολυ θα τα διαβασω με ευλαβια!!!
velociraptoras Δημοσ. 8 Μαΐου 2020 Δημοσ. 8 Μαΐου 2020 https://computing.llnl.gov/tutorials/pthreads/ κι εδώ ενα παλιότερο ιδιο θέμα
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα