PDA

Visualizza la versione completa : [C] Gestione dei thread in sistemi Unix


Javino89
30-01-2012, 14:38
Ho questo codice per esercitarmi sulla gestione dei thread in sistemi unix:



#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <string.h>

#define MAX_CHAR 1000
#define MAX_STRING 1000

int string_number=0;
char * string_array[MAX_STRING];
int status;

void * OrderThread(void * new_string)
{
int i,j;

//printf("Ordering thread active\n");
for (i=0 ; i < string_number; i++) {
if (strcmp(new_string,string_array[i]) <= 0) {
for (j=0; j<(string_number-i); j++) {
string_array[string_number - j] = string_array[string_number - j - 1];
}
break;
}
}
string_array[i] = new_string;
string_number++;
status = 0;
pthread_exit((void *)&status);
}

main()
{
int i;
pthread_t tid;
char * old_buffer;
void * status;
char buffer[MAX_CHAR];
int notfirst = 0;

while(1) {
printf("Inserisci stringa: ");
scanf("%s", buffer);
if (strcmp(buffer, "quit") == 0) break;
old_buffer = strdup(buffer);
if (notfirst) pthread_join(tid, &status);
else notfirst = 1;
i=pthread_create(&tid, NULL, OrderThread, (void *)old_buffer);
if (i) {
printf("cannot create thread for error %d\n", i);
exit(-1);
}
}
pthread_join(tid, &status);
for (i=0; i< string_number; i++) printf("String %d: %s\n", i,string_array[i]);
exit(0);
}


Intanto se lo eseguo non si comporta come dovrebbe, poi vorrei capirne meglio la logica passo per passo. Sono nuovo al C e sto impazzendo non poco.

La logica generale dovrebbe essere questa: L'utente inserisce un tot numero di stringhe a piacere (fin quando scrive quit ed il programma termina) e il programma dovrebbe ordinarle utilizzando un'altro thread distinto.

1) Parte tutto ovviamente dal main.

2) Dichiaro un intero, il secondo parametro dovrebbe essere un puntatore ad un buffer di informazioni sul thread (?), puntatore ad un char (quindi una stringa), puntatore void, array di char, altro intero.

3) Inizia un ciclo.

4) Acquisisco stringa da input e la salvo nell'array di char buffer.
5) Se la stringa è "quit" termino il programma.
6) Il puntatore di tipo char, punterà alla stringa che sta dentro buffer, giusto?
7) Qui mi perdo con la logica.. ma dovrebbe essere tipo: se sto elaborando ancora una stringa, aspetta che il thread creato finisca. Cosa gli sto passando di PRECISO come parametri?
8) Setta notfirst = 1, help me to understand xD
9) Creo il thread passandogli: indirizzo della struttura contenente informazioni di supporto al thread, parametri di default, quale operazione deve fare il thread, parametri da passare a questa operazione.

Qui i due metodi lavorano contemporaneamente?
10) Ordino le stringhe con OrderThread

11) Se ho restituito un valore diverso da 0, allora la creazione del thread è fallita.
12) Aspetto ancora. Mi sono perso con la logica
13) Stampo le stringhe ordinate..

Aiutatemi a comprendere bene questo pezzo di codice please XD :)

Javino89
31-01-2012, 14:28
..troppo complicato? :confused:

oregon
31-01-2012, 14:47
No ... ma non sempre si ha il tempo per rispondere subito ... bisogna avere pazienza.

Quello che non si capisce - a prima vista - è il perché tu crei tanti thread (nel ciclo, un nuovo thread ogni parola inserita ...)

Javino89
31-01-2012, 23:34
Oddio sinceramente non so risponderti. E' un esempio che mi è stato posto all'università per capire i thread. A prima vista credevo che il ciclo servisse esclusivamente per l'inserimento continuo di stringhe. Comunque quando lo eseguo e scrivo quit, il programma non termina affatto. E non mi stampa nemmeno le stringhe ordinate. Continua a uscire:

inserisci stringa: bla
inserisci stringa: ciao
inserisci stringa: ...

fino a quando premo ctrl + c per chiudere >.>

oregon
01-02-2012, 09:42
Originariamente inviato da Javino89
Oddio sinceramente non so risponderti.

Beh, scusa ma è singolare questa cosa. Non si può studiare il C con il copia-incolla senza capire quello che si scrive.


A prima vista credevo che il ciclo servisse esclusivamente per l'inserimento continuo di stringhe.

Ma la creazione del thread avviene all'interno del ciclo, un nuovo thread per ogni parola ...

Vedi di fare le correzioni ...

Javino89
01-02-2012, 13:15
La filosofia del professore è stata questa: ci ha mostrato il c per differenze col java (in due lezioni!), subito dopo abbiamo parlato di processi e thread e ci ha mostrato questo codice! (e la versione per windows). Ma non so se deve essere effettivamente corretto, insomma, l'ha fatto il professore XD

In sostanza ci dobbiamo arrangiare col C. Sarebbe già qualcosa capire perché non riconosce la quit.

ramy89
01-02-2012, 15:13
Originariamente inviato da oregon
Beh, scusa ma è singolare questa cosa. Non si può studiare il C con il copia-incolla senza capire quello che si scrive.


All' università è così.
Io le dispense non le consulto neanche,Javino89 ti conviene studiare per conto tuo su un libro.Studiare il codice di altri dovrebbe essere solo l' "ultima spiaggia".

Javino89
01-02-2012, 16:09
Aspettate. Il codice che avevo non era identico a quello che ho incollato ma gli mancava un pezzo, per questo non funzionava a dovere. Ora l'ho aggiustato ma le cose vanno peggio, non compila!

Gli errori sono questi:

thread.c: In function ‘main’:
thread.c:51: warning: incompatible implicit declaration of built-in function ‘exit’
thread.c:57: warning: incompatible implicit declaration of built-in function ‘exit’
/tmp/cc9Ocw8G.o: In function `main':
thread.c: (.text+0x14d): undefined reference to `pthread_join'
thread.c: (.text+0x194): undefined reference to `pthread_join'
thread.c: (.text+0x1c3): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

oregon
01-02-2012, 16:32
Perdonami ... dici che il codice non era quello, non mostri quello effettivo, ma ci dici di chiarirti gli errori ...

Non capisco il senso della richiesta ...

Javino89
01-02-2012, 17:22
Mi sono spiegato male, calma. Il codice qui presente è quello corretto, io personalmente avevo un codice incompleto.

Loading