koutsijunior Δημοσ. 15 Νοεμβρίου 2010 Δημοσ. 15 Νοεμβρίου 2010 Να γραφεί πρόγραμμα σε C στο οποίο το αρχικό νήμα θα διαβάζει χαρακτήρες από το χρήστη. Όταν λάβει ένα σήμα SIGUSR1, τότε σταματάει την εισαγωγή χαρακτήρων και θα δημιουργεί δύο νήματα. Τα νήματα θα τυπώνουν εναλλάξ όλα τα γράμματα που διαβάστηκαν εναλλάξ (Πχ. Αρχικό νήμα: "Nikhtas!", Νήμα-1: "Nkts", Νήμα-2: "iha!". > #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *show(); void *count(); char buffer[1000]; char *s; void telos(int sig){//Function for SIGUSR1 int main(){ pthread_t thread1, thread2; s = buffer; printf("Please give characters:"); while((*s++ = getchar())!= 'q');// apo8ikeuei xaraktires mexri na brei to q //osoi einai meta to q den lambanontai upopsin *s--; printf("Uuuups you pressed 'q'... \nWhatever you pressed after that is gone\n"); *s='\0'; pthread_create(&thread1, NULL, &show, NULL);//dimiourgei 2 nimata pthread_create(&thread2, NULL, &count, NULL); pthread_join(thread1, NULL);//perimenoume ton termatismo twn nimatwn pthread_join(thread2, NULL); return 0; } void *show(){ //me8odos 1ou nimatos εχω προβλημα με το σημα πως να το βαλω γι αυτο εβαλα γραμμα να σταματαει την εισαγωγη.κι εχω κ προβλημα πως να διαχωρισω τους χαρακτηρεσ συα νηματα. αν μπορει καποιος να βοηθησει!!
bnvdarklord Δημοσ. 15 Νοεμβρίου 2010 Δημοσ. 15 Νοεμβρίου 2010 Κάτι τετοιο θες ; > void *show() { int i = 0; while(buffer[i] != '\0') { printf("THREAD 1: %c\n", buffer[i]); i = i + 2; if(i > 999) break; } } void *count() { int i = 1; while(buffer[i] != '\0') { printf("THREAD 2: %c\n", buffer[i]); i = i + 2; if(i > 999) break; } }
koutsijunior Δημοσ. 15 Νοεμβρίου 2010 Μέλος Δημοσ. 15 Νοεμβρίου 2010 αυτος ο κωδικας διαχωριζει τα νηματα να εμφανιζουν το ενα τους αρτιους χαρακτηρες και το αλλο τους περιττους οπως λεει το προγραμμα οταν εισαγουμε χαρακτηρες? με το σημα ξερεις πως θα το βαλω για να σταματαει την εισαγωγη χαρακτηρων αντι το γραμμα q? ευχαριστω πολυ
bnvdarklord Δημοσ. 15 Νοεμβρίου 2010 Δημοσ. 15 Νοεμβρίου 2010 Αυτο κανει αλλα τους βγαζει εναν εναν, δες ενα ouput Please give characters: SENTENCEEXAMPLEq Uuuups you pressed 'q'... Whatever you pressed after that is gone THREAD 1: S THREAD 1: N THREAD 1: E THREAD 1: C THREAD 1: E THREAD 1: A THREAD 1: P THREAD 1: E THREAD 2: E THREAD 2: T THREAD 2: N THREAD 2: E THREAD 2: X THREAD 2: M THREAD 2: L (Ο λογος που το thread2 ξεκιναει αφου τελειωσει το thread1 μου ειναι αγνωστος) Για το δευτερο ερωτημα σου δεν ειμαι σιγουρος τωρα, και πρεπει να φυγω θα το κοιταξω αργοτερα αν δεν εχει απαντησει καποιος αλλος.
koutsijunior Δημοσ. 15 Νοεμβρίου 2010 Μέλος Δημοσ. 15 Νοεμβρίου 2010 Μαλλον θελει να χρησιμοποιησω pthread_mutex_lock k pthread_mutex_unlock για να βγαινει ενα ενα νημα.αν κ ειναι σωστο ετσι νομιζω και μονο το σημα χρειαζεται για να ολοκληρωθει.αν εχεις καμια ιδεα για το σημα στειλτο. παντως ευχαριστω πολυ. μου βγαζει πολλα error εμενα.αν γινεται στειλε μου ολο το προγραμμα οπως το εκανες compile εσυ για να το δοκιμασω. ---------- Προσθήκη στις 19:36 ---------- Προηγούμενο μήνυμα στις 17:52 ---------- > #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *show(); void *count(); char buffer[1000]; char *s; pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALISER; int main(){ pthread_t thread1, thread2; s = buffer; printf("Please give characters:"); while((*s++ = getchar())!= 'q');// apo8ikeuei xaraktires mexri na brei to q //osoi einai meta to q den lambanontai upopsin *s--; printf("Uuuups you pressed 'q'... \nWhatever you pressed after that is gone\n"); *s='\0'; pthread_create(&thread1, NULL, &show, NULL);//dimiourgei 2 nimata pthread_create(&thread2, NULL, &count, NULL); pthread_join(thread1, NULL);//perimenoume ton termatismo twn nimatwn pthread_join(thread2, NULL); return 0; } void *show(){ //me8odos 1ou nimatos int i = 0; while(buffer[i] != '\0') { printf("THREAD 1: %c\n", buffer[i]); pthread_mutex_lock(&mutex); i = i + 2; if(i > 999) break; pthread_mutex_unlock(&mutex); } } void *count() { int i = 1; while(buffer[i] != '\0') { printf("THREAD 2: %c\n", buffer[i]); pthread_mutex_lock(&mutex); i = i + 2; if(i > 999) break; pthread_mutex_unlock(&mutex); } } μου βγαζει λαθη αν μπορει καποιος να πει τι λαθος εχει!!
bnvdarklord Δημοσ. 15 Νοεμβρίου 2010 Δημοσ. 15 Νοεμβρίου 2010 Αν χρησιμοποιείς gcc θελει παράμετρο -lpthread διπλα δηλαδη gcc program.c -lpthread .
koutsijunior Δημοσ. 15 Νοεμβρίου 2010 Μέλος Δημοσ. 15 Νοεμβρίου 2010 ναι το ξερω αλλα μου βγαζει λαθη.μου στελνεις τον κωδικα οπως τν εκανες compile εσυ και αν μπορεις να δοκιμασεις και το τελευταιο κωδικα που εδωσα?
bnvdarklord Δημοσ. 16 Νοεμβρίου 2010 Δημοσ. 16 Νοεμβρίου 2010 Διορθωσα αυτό και έτρεξε pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; Βεβαια με τα mutex κανεις το ενα να περιμένει εναν κύκλο απο το άλλο, αν θες να αρχιζουν και ειναι ανεξάρτητα θα πρεπει να το αφαιρεσεις.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.