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);
}