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

Πρόβλημα σε πρόγραμμα με νήματα!!!


koutsijunior

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

Δημοσ.

Να γραφεί πρόγραμμα σε 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

 

 

εχω προβλημα με το σημα πως να το βαλω γι αυτο εβαλα γραμμα να σταματαει την εισαγωγη.κι εχω κ προβλημα πως να διαχωρισω τους χαρακτηρεσ συα νηματα.

αν μπορει καποιος να βοηθησει!!

Δημοσ.

Κάτι τετοιο θες ;

 

>
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;
}

}

Δημοσ.

αυτος ο κωδικας διαχωριζει τα νηματα να εμφανιζουν το ενα τους αρτιους χαρακτηρες και το αλλο τους περιττους οπως λεει το προγραμμα οταν εισαγουμε χαρακτηρες?

με το σημα ξερεις πως θα το βαλω για να σταματαει την εισαγωγη χαρακτηρων αντι το γραμμα q?

ευχαριστω πολυ

Δημοσ.

Αυτο κανει αλλα τους βγαζει εναν εναν, δες ενα 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 μου ειναι αγνωστος)

 

Για το δευτερο ερωτημα σου δεν ειμαι σιγουρος τωρα, και πρεπει να φυγω θα το κοιταξω αργοτερα αν δεν εχει απαντησει καποιος αλλος.

Δημοσ.

Μαλλον θελει να χρησιμοποιησω 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);
}
}

 

μου βγαζει λαθη αν μπορει καποιος να πει τι λαθος εχει!!

Δημοσ.

ναι το ξερω αλλα μου βγαζει λαθη.μου στελνεις τον κωδικα οπως τν εκανες compile εσυ και αν μπορεις να δοκιμασεις και το τελευταιο κωδικα που εδωσα?

Δημοσ.

Διορθωσα αυτό και έτρεξε

 

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

 

Βεβαια με τα mutex κανεις το ενα να περιμένει εναν κύκλο απο το άλλο, αν θες να αρχιζουν και ειναι ανεξάρτητα θα πρεπει να το αφαιρεσεις.

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

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

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