PThread Mutex Lock&在堆栈上解锁

时间:2013-01-28 05:13:42

标签: c++ c

#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;
}

这是我的data1和data2文件

DATA1:     退让     侮     自卑     abases     惑     愧     abashes     abashing     abasing     杀     减弱     减排     消退     缓和     屠宰场     僧院     abbort     简略     简短的     简写     缩写     缩写     缩写     退位     退位     退位     退位     腹部     拐     绑架

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

上面是我的互斥代码,但我想知道为什么我只能将1个数据写入文件result.dat

这是我的输出

1个数据写入文件result.dat

1 个答案:

答案 0 :(得分:0)

首先,pthread_mutex_unlock(&mutex);pthread_exit(NULL);位置不正确。将其放在return NULL语句之前。

代码中有几处错误。请在下面找到更新的代码。

    #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;
}