Utilizzo di una struttura globale con pthreads in C [chiuso]

-2

Sto provando a simulare i clienti che entrano in una banca e vengono serviti da cassieri per un periodo di tempo. Sto usando una discussione per determinare se un cliente è arrivato in banca tramite una tariffa di arrivo e sto utilizzando più thread per rappresentare i cassieri con una percentuale di servizio s. Sto usando una struttura per contenere il periodo di tempo, la velocità di arrivo, la velocità di servizio, il numero di cassieri e la coda di attesa del cliente. Sto tentando di condividere quella struttura tra tutti i thread, ma ottengo errori "puntatore di dereferenziamento" e "richiesta per membro x in qualcosa non una struttura".

//Used to store information input by user and the customer queue
struct shiftInfo {
    int tellers;
    int serviceTime;
    int simTime;
    int sampleInterval;
    int threadID;
    float arrivalRate;
    int Q[]; //Customer Queue
};

Le informazioni vengono passate dalla struct alla riga di comando tramite

    struct shiftInfo *Q = malloc(sizeof(struct shiftInfo) + (maxCust*sizeof(int)));
    struct shiftInfo info;
    info.simTime = atoi(argv[1]);
    info.arrivalRate = atof(argv[2]);
    info.tellers = atoi(argv[3]);
    info.serviceTime = atoi(argv[4]);
    info.sampleInterval = atoi(argv[5]);
    //Initiates Q to 0
    for (int i = 0; i < maxCust; i++)
        info.Q[i] = 0;

Il teller, il timer e i thread dei clienti vengono creati e terminati da una discussione principale

  //Manager thread is main thread
  pthread_t manager;
  iret = pthread_create(&manager, NULL, mainThread, (void *)&info);
  if (iret){
    printf("ERROR: return code %d\n", iret);
    exit(-1);
    }

Per farla breve, chiederò solo informazioni sul thread del timer e spero di applicare la risposta agli altri thread. Il thread del timer viene creato nel thread principale di:

  int status;
  struct shiftInfo *I = info; 
  pthread_t time;
      status = pthread_create(&time, NULL, timer, (void *)info);
      if (status){
        printf("ERROR CODE: %d\n", status);
        exit(-1);
    }

E la funzione del timer è:

void *timer(void *info){
    int timeRemaining = info -> simTime;
    while(timeRemaining){
        sleep(1);
        timeRemaining--;
        }
}

Per "int timeRemaining = info - > simTime;" Ricevo l'avviso "dereferencing void pointer" e la richiesta di errore per il membro âsimTimeâ in qualcosa che non sia una struttura o unione. Qualsiasi consiglio sarebbe apprezzato.

Inoltre, creo il thread del cliente in modo identico al modo in cui creo il thread del timer ma ricevo un avvertimento (attenzione: passare l'argomento 3 di âpthread_createâ rende il puntatore dal numero intero senza cast [abilitato per impostazione predefinita]) che non ricevo quando creando un altro thread, che cosa causa?

pthread_t customer;
    status = pthread_create(&customer, NULL, customer, (void *)info);
        if (status){
            printf("ERROR CODE: %d\n", status);
            exit(-1);
        }
    
posta CSjunkie 27.11.2014 - 05:53
fonte

2 risposte

1
struct shiftInfo *Q = malloc(sizeof(struct shiftInfo) + (maxCust*sizeof(int)));

Questo alloca un oggetto struct shiftInfo con lo spazio riservato per maxCust interi. Sembra ok ...

struct shiftInfo info;
info.simTime = atoi(argv[1]);
info.arrivalRate = atof(argv[2]);
info.tellers = atoi(argv[3]);
info.serviceTime = atoi(argv[4]);
info.sampleInterval = atoi(argv[5]);

... ma poi questo ^ crea un altro oggetto struct shiftInfo , senza spazio extra riservato ai clienti e con ambito locale.

//Initiates Q to 0
for (int i = 0; i < maxCust; i++)
    info.Q[i] = 0;

E infine, questo ^ imposta l'array cliente che non esiste nell'oggetto locale. L'oggetto allocato dinamicamente chiamato Q , che fa ha spazio per questo array cliente, non sembra mai essere usato.

    
risposta data 27.11.2014 - 11:58
fonte
0

Un puntatore vuoto non dice nulla su cosa sta puntando: è un "puntatore a qualsiasi cosa". Quindi info -> simTime non ha significato per il compilatore. È necessario riportare il puntatore al tipo corretto prima di dereferenziarlo. Se sai che sarà sempre uno shiftInfo, quindi prova qualcosa come ((shiftInfo *) info) -> simTime .

Il tuo secondo avviso probabilmente indica un bug nel tuo programma. Il terzo parametro dovrebbe essere un pointer-to-function, ma lo stai passando customer , che è un pthread_t.

    
risposta data 27.11.2014 - 12:25
fonte

Leggi altre domande sui tag