Having a little problem with a threaded producer/consumer application - one producer, multiple consumers.
Code:
producer(){
for (i=9; i<argc; i++){
//handle files
input = fopen(argv[i], "r");
if (!input){
fprintf(stderr, "File \"%s\" Not available.\n", argv[i]);
continue;
}//if
while(!feof(input)){
if (pthread_mutex_lock(&bufMutex[writepos]))
fail("Mutex Error");
while (BUF_FULL){
if (name-'a'<max){
if (pthread_create(&thread[name-'a'], NULL, reader, &name))
fail("Error Creating Reader Threads");
name++;
}//if
pthread_cond_wait(&NotFull, &bufMutex[writepos]);
}//while
do{
fgets(buffer[writepos], LINELEN, input);
int len=strlen(buffer[writepos])-1;
if (len && buffer[writepos][len]=='\n')
buffer[writepos][len]=0x0;
}while (!feof(input) && buffer[writepos][0]==0x0);
if (pthread_mutex_unlock(&bufMutex[writepos]))
fail("Mutex Error");
if (!buffer[writepos][0])
continue;
writepos = (writepos+1)%lines;
if(pthread_cond_signal(&NotEmpty))fail("Signaling Error!");
usleep(1000*fdelay);
}//while
}//for
printf("Finished reading.\n");
if (pthread_mutex_lock(&bufMutex[writepos]))
fail("Mutex Error");
buffer[writepos][0]=0x0;
writepos++;
if (pthread_mutex_unlock(&bufMutex[writepos]))
fail("Mutex Error");
void *whocares;
printf("Write Position: %d Read Position: %d\n", writepos, readpos);
printf("Threads in existence: %d\n", (int)name-'a');
printf("Hey, other threads, wake up!\n");
if(pthread_cond_signal(&NotEmpty))fail("Signaling Error!");
printf("Waiting for thread termination.\n");
for(name=name-'b';name>=0;name--)
pthread_join(thread[(int)name], &whocares);
}
}
Code:
consumer(){
char buf[LINELEN];
do{
if (pthread_mutex_lock(&readTex)) fail("Error locking Mutex"); //protect me from other readers
while (BUF_EMPTY){
printf("\nWaiting for buffer to have data...");
pthread_cond_wait(&NotEmpty, &readTex);
printf("I'm up!");
}
if (pthread_mutex_lock(&bufMutex[readpos])) fail("Error locking Mutex"); //protect me from the writer
strcpy(buf, buffer[readpos]);
printf("\nGot a line...");
if (buf[0]){
readpos = (readpos+1)%lines;
printf("Not empty.\n");
}
//else
//break;
if (pthread_mutex_unlock(&bufMutex[readpos])) fail("Error locking Mutex");
if (pthread_mutex_unlock(&readTex)) fail("Error locking Mutex");
if (pthread_cond_signal(&NotFull))fail("Signaling Error!");
char* tokenizer=buf;
char* tok;
usleep(1000*tdelay);
while((tok=nextTok(&tokenizer))[0]!=0x0){
addWord(tok, strlen(tok)%2);
printf("%c", *((char*)n));
}
}while(buf[0]);
if(pthread_cond_signal(&NotEmpty))fail("Signaling Error!");
pthread_exit((void *)NULL);
return NULL; //I know this is redundant, but hey.
}
For some reason, the last pthread_cond_signal in the producer doesn't actually want to wake up the consumer. Anyone have any idea why?