I have a program that is trying to use create and cancel through an implemented pool.
The creation is as follows:
while (created<threadsNum){
pthread_t newThread;
pthread_struct *st; //Open the thread that handle the deleting of the sessions timeout.
st = (pthread_struct*)malloc(sizeof(pthread_struct));
st->id = created;
st->t = &newThread;
pthread_mutex_lock( &mutex_threadsPool );
readingThreadsPool[created] = st;
pthread_mutex_unlock( &mutex_threadsPool );
if((threadRes1 = pthread_create( &newThread, NULL, pcapReadingThread, (void*)created)))
{
syslog(LOG_CRIT, "Creating Pcap-Reading Thread %d failed.",created);
printf( "Creating Pcap-Reading Thread %d failed.\n",created);
exit(1);
}
syslog(LOG_INFO, "Created Pcap-Reading Thread %d Successfully.",created);
created++;
}
Later I try to cancel them and restart them :
pthread_t* t;
pthread_struct* tstr;
int i;
pthread_mutex_unlock( &mutex_threadsPool );
//first go on array and kill all threads
for(i = 0; i<threadsNum ; i++ ){
tstr = readingThreadsPool[i];
if (tstr!=NULL){
t = tstr->t;
//Reaches here :-)
if (pthread_cancel(*t)!=0){
perror("ERROR : Could not kill thread");
}
else{
printf("Killed Thread %d \n",i);
}
//doesnt reach here
}
}
I checked the addresses in the memory of the created thread in part one and the address of the about to be cancelled thread in the second part..they match..
I read about the thread manager that can’t work if one calls killall().
But I don’t..
Anyone have any idea?
Thanks
You’ve got
st->tpointing to a local variablenewThread.newThreadis only in scope during the current loop iteration. After this iterationst->twill contain an invalid address.newThreadis on the stack, so after it goes out of scope that stack space will be used for other variables. That could be differentpthread_ts on successive iterations, or once the loop is over then that stack space will be used for completely different types of values.To fix this I’d probably change
pthread_struct.tto be apthread_tinstead of apthread_t *, and then change the pthread_create call to:Also, you should be careful about adding
stto the thread pool before you’ve calledpthread_create. It should probably be added after. As it stands, there’s a small window wherest->tis on the thread pool but has not been initialized.