简体   繁体   English

PThread Mutex在堆栈上锁定和解锁

[英]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和data2文件

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 数据1:放弃abase abases abash扑灭abashs扑灭absing ab Abed缩写abb

data2 : 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 上面是我的互斥锁代码,但我想知道为什么我只能向文件result.dat中写入1个数据

This is my output 这是我的输出

1 data written to file result.dat 1个数据写入文件result.dat

To start with, pthread_mutex_unlock(&mutex);pthread_exit(NULL); 首先, pthread_mutex_unlock(&mutex);pthread_exit(NULL); location is incorrect. 位置不正确。 Place this before return NULL statement. 将其放在return NULL语句之前。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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