Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C Unix] aiuto comprensione codice

    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

  2. #2
    ..troppo complicato?

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    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 >.>

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    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.

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    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".

  8. #8
    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

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Mi sono spiegato male, calma. Il codice qui presente è quello corretto, io personalmente avevo un codice incompleto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.