Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C/C++] Funzioni e pthread

    ciao a tutti, allora non sono molto ferrato in programmazione ma il mio problema è questo:
    devo fare un pool di thread che ciclicamente attende delle richieste da dei client (che possono anche essere delle funzioni messe nel main che mandano dei parametri tipo un messaggio e un tempo t, io praticamente devo solo fare della programmazione concorrente), serve la richiesta e poi si mette in attesa.

    creo i miei pthread nel main:
    codice:
      err = pthread_create(&id4, NULL, thread_reader, "T4");
      if (err) {
        perror("PThread Create");
      }
    dopo dovrei mettere le richieste dei client

    e in ogni thread metto un ciclo while infinito che mi prenderà le richieste e le serve
    codice:
    void *thread_reader(void *v)
    {
    while("true") {
    }
    }
    Ora, la mia domanda è questa: come posso fare per passare i miei parametri della richiesta ad un thread? ossia una volta che il thread è nel ciclo while deve sapere quando arriva una richiesta, prendersela e fare quello che fa.....come si può fare?

    Grazie....

  2. #2
    Ci sono diverse possibilità: memoria condivisa, pipe, socket, risorse esterne (file, database ecc..);

  3. #3
    alla fine abbiamo risolto con un thread nuovo che manda le richieste, ora però ho un problema di segmentation fault che non riusciamo a risolvere.....
    allora, c'è una coda circolare fatta di un array di struct, il thread client inserisce nella coda (si blocca se è piena)
    codice:
    int insert_CA(struct element x)
    {
      if(a.num == 5)
        return 0;
      a.elements[a.head] = x;
      a.head = (a.head + 1) % 5;
      a.num++;
      return 1;
    }
    poi sblocca eventuali thread bloccati se ce ne sono altrimenti lascia in coda e se lo prenderà il primo thread che finisce.
    codice:
    int extract_CA(struct element *x)
    {
      if(a.num == 0)
        return 0;
      *x = a.elements[a.tail];
      a.tail = (a.tail + 1) % 5;
      a.num--;
      return 1;  
    }
    questo è il codice di extract, ma funziona correttamente vedendo i log che generiamo.

    il problema è qui:
    codice:
    void put_richiesta(struct buffer *b)
    {
      struct element *x;
      int i=0;
      pthread_mutex_lock(&b->m);
      fprintf(stderr, "T bloccato\n");
      b->blocked_readers++;
      pthread_cond_wait(&b->block_read, &b->m);
      fprintf(stderr, "T sbloccato........\n");
      fprintf(stderr, "prima dell'estrazione "); print_CA();
      if (extract_CA(x) == 1) { 
        //fprintf(stderr, "1");
        for (i=0; i<x->t; i++) {
        fprintf(stderr, "%s\n", x->msg);
        sleep(1);
        }
        //fprintf(stderr, "2");
      pthread_mutex_unlock(&b->m);
      fprintf(stderr, "dopo l'estrazione ");print_CA();
      }
      else {
      fprintf(stderr, "Non ci sono elementi in coda\n");
      pthread_mutex_unlock(&b->m);
      }
      extract_CA(x);
      pthread_mutex_unlock(&b->m);
    }
    La prima volta che estraiamo lo fa perfettamente, dopo di che mettiamo qualcos'altro nella coda, il client quindi sblocca un thread che riesegue questa funzione e il programma si blocca alla riga che vi ho segnato in rosso....
    Perchè? non sappiamo più come fare..

  4. #4
    se serve vi posso anche postare l'intero programma tanto non sono tante linee di codice (circa 200), se volete provarlo voi, ditemi così posto e mi dite dove abbiamo sbagliato........
    Grazie.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.