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

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

Δημοσ.

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.
 

ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ ΟΛΟΥΣ ΕΣΤΩ ΚΑΙ ΑΝ ΜΠΕΙΚΑΤΕ ΝΑ ΔΕΙΤΕ ΤΟ ΠΟΣΤ ΟΠΟΙΑΔΗΠΟΤΕ ΣΥΜΒΟΥΛΗ ΕΥΠΡΟΣΔΕΚΤΗ!

Δημοσ.
Αναφορά σε κείμενο

ΕΧΩ ΤΡΕΛΑΘΕΙ ΝΑ ΨΑΧΝΩ ΕΣΤΩ ΘΕΩΡΙΑ ΓΙΑ ΝΑ ΔΙΑΒΑΣΩ ΝΑΤΗΝ ΛΥΣΩ ΕΧΩ ΤΡΕΛΑΘΕΙ.

Τι έχεις κάνει λοιπόν μέχρι τώρα?

  • Like 1
Δημοσ.
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;
}

Δημοσ.

Σου στέλνω σε πμ κάποιες διαλέξεις που έχουν παραδείγματα για posix threads. Καλύπτουν μέχρι τα mutexes και ίσως και τα barriers. Είναι με παραδείγματα βήμα βήμα και καλύπτουν όσα χρειάζεσαι.

Μερικές παρατηρήσεις που ίσως δεν τις βρεις με την πρώτη ματιά στις διαλέξεις όμως:

  • to include προτίμησε να είναι πάντα η πρώτη βιβλιοθήκη που γίνεται import. Κάποιοι compilers crasharoun
  • To i στο for, προτίμησε να είναι long όταν κάνεις create threads
  • Τα δεδομένα σου καλύτερα να τα περνάς ως struct
  • Τα υπόλοιπα νομίζω θα τα βρεις εύκολα σε αυτό που σου στέλνω
  • Like 1
Δημοσ.
1 λεπτό πριν, Ponous είπε

Σου στέλνω σε πμ κάποιες διαλέξεις που έχουν παραδείγματα για posix threads. Καλύπτουν μέχρι τα mutexes και ίσως και τα barriers. Είναι με παραδείγματα βήμα βήμα και καλύπτουν όσα χρειάζεσαι.

Μερικές παρατηρήσεις που ίσως δεν τις βρεις με την πρώτη ματιά στις διαλέξεις όμως:

  • to include προτίμησε να είναι πάντα η πρώτη βιβλιοθήκη που γίνεται import. Κάποιοι compilers crasharoun
  • To i στο for, προτίμησε να είναι long όταν κάνεις create threads
  • Τα δεδομένα σου καλύτερα να τα περνάς ως struct
  • Τα υπόλοιπα νομίζω θα τα βρεις εύκολα σε αυτό που σου στέλνω

Σε ευχααριστω παρα παρααα πολυ θα τα διαβασω με ευλαβια!!!

 

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

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

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

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

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

Σύνδεση

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

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