I’m trying to simulate clients going into a bank and being served by tellers over a period of time. I am using a thread to determine if a client came into the bank via an arrival rate and am using multiple threads to represent tellers with an s service rate. I am using a struct to hold the period of time, arrival rate, service rate, number of tellers, and the customer waiting queue. I am attempting to share that struct between all threads but get “dereferencing pointer” errors and “request for member x in something not a structure” error.
//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
};
The information is passed from into the struct from the command line via
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;
The teller, timer, and customer threads are created and terminated by a main thread
//Manager thread is main thread
pthread_t manager;
iret = pthread_create(&manager, NULL, mainThread, (void *)&info);
if (iret){
printf("ERROR: return code %dn", iret);
exit(-1);
}
To keep this short I’m going to only ask about the timer thread and hopefully apply the answer to the other threads. The timer thread is created in the main thread by:
int status;
struct shiftInfo *I = info;
pthread_t time;
status = pthread_create(&time, NULL, timer, (void *)info);
if (status){
printf("ERROR CODE: %dn", status);
exit(-1);
}
And the timer thread function is:
void *timer(void *info){
int timeRemaining = info -> simTime;
while(timeRemaining){
sleep(1);
timeRemaining--;
}
}
For “int timeRemaining = info -> simTime;” I get the warning “dereferencing void pointer” and the error request for member âsimTimeâ in something not a structure or union.
Any advice would be appreciate.
Also, I create the customer thread identically to the way I create the timer thread but receive a warning (warning: passing argument 3 of âpthread_createâ makes pointer from integer without a cast [enabled by default]) that I do not receive when creating any other thread, what causes that?
pthread_t customer;
status = pthread_create(&customer, NULL, customer, (void *)info);
if (status){
printf("ERROR CODE: %dn", status);
exit(-1);
}
1
struct shiftInfo *Q = malloc(sizeof(struct shiftInfo) + (maxCust*sizeof(int)));
This allocates a struct shiftInfo
object with space reserved for maxCust
integers. Looks 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]);
… but then this ^ creates another struct shiftInfo
object, with no extra space reserved for customers, and with local scope.
//Initiates Q to 0
for (int i = 0; i < maxCust; i++)
info.Q[i] = 0;
And finally, this ^ sets up the customer array that doesn’t exist in the local object. The dynamically-allocated object called Q
, which does have space for this customer array, never seems to be used.
3
A void pointer says nothing about what it is pointing to – it’s a “pointer to anything”. So info -> simTime
is not meaningful to the compiler. You need to cast the pointer back to the correct type before dereferencing it. If you know that it will always be a shiftInfo, then try something like ((shiftInfo *) info) -> simTime
.
Your second warning is probably pointing out a bug in your program. The 3rd parameter is supposed to be a pointer-to-function, but you are passing it customer
, which is a pthread_t.