简体   繁体   中英

PThread Mutex Lock & Unlock on Stack

#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 before return NULL statement.

There were couple of errors in the code. Please find below the updated code.

    #include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM_THREADS     2

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

char **AddToStack(char *buffer)
{
  static char **stack = NULL;
  static int stacksize = 0;

  if (buffer == NULL)
    return stack;

  if (stack == NULL){
    stack = (char**)calloc(1, sizeof(char*));
  }
  stack[stacksize] = strdup(buffer);
  stacksize++;
  stack = (char**)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);
  }
  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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM