#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 2
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
char **AddToStack(char *buffer)
{
static char **stack = NULL;
int stacksize = 0;
if (buffer == NULL)
return stack;
if (stack == NULL){
stack = calloc(1, sizeof(char*));
}
stack[stacksize] = strdup(buffer);
stacksize++;
stack = realloc(stack, (stacksize+1) * sizeof(char*));
stack[stacksize] = NULL;
return stack;
}
void *FRead(void *threadid)
{
pthread_mutex_lock(&mutex);
char fname[256], buffer[256];
FILE *ifile;
long tid;
int counter;
tid = (long)threadid;
sprintf(fname, "data%ld", tid);
if ((ifile = fopen(fname, "r")) == NULL){
printf("Error: Thread #%ld was unable to open file %s!\n", tid, fname);
}
else{
printf("Thread #%ld starting to read from file %s!\n", tid, fname);
fscanf(ifile, "%s", buffer);
counter = 0;
while (!feof(ifile)){
//pthread_mutex_lock(&mutex);
counter++;
AddToStack(buffer);
fscanf(ifile, "%s", buffer);
//pthread_mutex_unlock(&mutex);
}
fclose(ifile);
printf("Thread #%ld added %d entries to the stack!\n", tid, counter);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc, i = 0;
long t;
char **stack;
FILE *ofile;
for(t=0;t<NUM_THREADS;t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, FRead, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
for(t=0;t<NUM_THREADS;t++)
{
//pthread_join(threads[t],NULL);
}
//Lets write the content of the stack into a file
stack = AddToStack(NULL); //Get the base of the stack pointer
if (stack != NULL){
ofile = fopen("result.dat", "w");
for (i = 0; stack[i] != NULL; i++)
fprintf(ofile, "%s\n", stack[i]);
fclose(ofile);
}
fprintf(stderr, "%d data written to file result.dat\n", i);
pthread_exit(NULL);
return 0;
}
This is my data1 and data2 files
data1:
abandons
abase
abased
abases
abash
abashed
abashes
abashing
abasing
abate
abated
abatement
abates
abating
abattoir
abbey
abbort
abbreviate
abbreviated
abbreviates
abbreviating
abbreviation
abbreviations
abdicate
abdicated
abdicates
abdicating
abdomen
abduct
abducted
data2 :
God
I
I'll
I'm
I've
Miss
Worry
a
ability
able
aboard
about
above
abroad
absence
absent
absolute
accident
accidentally
according
accordingly
account
acquaintance
across
act
action
active
activity
actual
admiration
admission
adress
advance
advantage
adventure
Above is my mutex code, but i wonder why i only can write 1 data to the file result.dat
This is my output
1 data written to file result.dat
To start with,
pthread_mutex_unlock(&mutex);pthread_exit(NULL);location is incorrect. Place this beforereturn NULLstatement.There were couple of errors in the code. Please find below the updated code.