Ho questo codice per esercitarmi sulla gestione dei thread in sistemi unix:
codice:
#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