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 %ldn", t);
    rc = pthread_create(&threads[t], NULL, FRead, (void *)t);
    if (rc){
      printf("ERROR; return code from pthread_create() is %dn", 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, "%sn", stack[i]);
    fclose(ofile);
  }
  fprintf(stderr, "%d data written to file result.datn", i);
  pthread_exit(NULL);
  return 0;
}

这是我的数据1和数据2文件

数据1: 放弃 降低 自卑 阿巴斯 使困窘 羞愧 阿巴什斯 唠叨 阿贝辛 减少 减弱 减少 减少 减轻 屠宰场 修道院 阿伯特 缩写 缩写 缩略语 缩略语 缩写 缩写 辞职 退位 退位 退位 腹部 绑架 绑架

数据2 :

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 个数据写入文件结果.dat

这是我的输出

1 个数据写入文件结果.dat

首先,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 %ldn", t);
    rc = pthread_create(&threads[t], NULL, FRead, (void *)t);
    if (rc){
      printf("ERROR; return code from pthread_create() is %dn", 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, "%sn", stack[i]);
    fclose(ofile);
  }
  fprintf(stderr, "%d data written to file result.datn", i);
  pthread_exit(NULL);
  return 0;
}

最新更新