C语言中的线程问题

时间:2017-04-11 12:26:52

标签: c multithreading process

我正在尝试创建一个从文件中获取文本的程序,之后,它会告诉我该文本是否包含我想要搜索的字符串。我的想法是我必须用一个进程和多个线程来做所有事情。它是一个可变数字的线程数(我应该告诉终端我想要多少线程)。例如,如果我想要4个线程,文件中的文本将被分成4个字符串,每个线程将使用自己的字符串,并在该字符串中搜索我想要找到的单词。

为了验证自己一切正常,我试图在屏幕上打印一些变量(在server.c中)。在这里我遇到了一个问题,我无法弄明白。即使我告诉程序在屏幕上打印“init”变量,它也不会打印任何内容。打印尺寸,打印nr_thr,当我说打印“init”时,一切都可以,直到我到达零件。很明显,整个程序都没有用。

我该如何解决? 这个程序的想法没问题好吗?

  

这是server.c

###########Server.c##########
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <pthread.h>

struct argum{
  char string[100];
  char cautat[100];
};


void *cautare(void *data){
  int rez;
  printf("AM ajuns in thread");
  struct argum *argum = data;
  int i,j,k;
  if (strstr(argum->string,argum->cautat)){
    printf("Exista in string");
    rez=1;
  }
  else{
    printf("Nu exista in string asa ceva");
    rez=0;
  }

  return (void*)rez;
}

int main(int argc, char**argv){
  struct argum *argum = malloc(sizeof(struct argum));
  char buffer[1000];
  int nr_thr;
  int df1;
  ssize_t in, out;
  int init=0;
  int i;
  char *a[100];
  char b[1000];

  nr_thr=atoi(argv[3]);
  printf("\n Nr threaduri:%d \n",nr_thr);
  df1 = open(argv[1], O_RDWR);

  if (df1 == -1){
      perror("eroare deschidere ");
      //exit(1);
  }

  int size=lseek(df1, 0, SEEK_END);
  printf("\nSize:%d\n",size);

  lseek(df1, 0, SEEK_SET);

  for(i=0; i<=size; i++){
    if((lseek(df1, i, SEEK_SET))==-1){
      perror("Eroare in fisier");
    }

    in=read(df1,&buffer[i],1);
  }

  printf("In fisier este textul:");
  puts(buffer);

  init = size/nr_thr;

  printf("\nInitial: %d ",init);

  int k=0;
  int l=0;
  int j;

  while(init<=size){
    for(i=init; i<=size/nr_thr; i++){
      b[k]=buffer[i];
      k++;
    }
      a[l]=b;
      init=size/nr_thr;
      if(nr_thr>0){
        nr_thr--;
        l++;
      }
      k=0;
    }


  int rezultat;

  int *return_vals = malloc(nr_thr * sizeof(int));

  pthread_t threads[10];

  for(i=0; i<nr_thr; ++i){
    puts(a[i]);
    argum->string[100]= *a[i];
    argum->cautat[100]= *argv[2];
    pthread_create(&threads[i],NULL,cautare,argum);
  }

  for(i=0; i<nr_thr; ++i){
    rezultat=pthread_join(threads[i],(void**) &return_vals[i]);
    }

  for(i = 0; i < nr_thr; i++)
  printf("Thread %d returned: %d\n", i, return_vals[i]);

  exit(1);
}
  

这是client.c,我正在调用所有内容。

#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>

int main(){
  int id,d, stare;
  int nr_thr;
  char nume_fis[100], nume_cuv[100];
  char thr[100];
  d=1;
  while(d==1){
    printf("> ");
    scanf("%s %s %d",nume_fis,nume_cuv,&nr_thr);

    sprintf(thr,"%d",nr_thr);
    id=fork();

    if(id<0){
      perror("Eroare la creare proces");
      return -1;
    }
    else if(id==0){ //fiu
      execl("./server","server",nume_fis,nume_cuv,thr,NULL);
      perror("eroare la exec");
    }
    else{
      wait(&stare);
      if(WIFEXITED(stare)){
        printf("%d",WEXITSTATUS(stare));
      }
    }

    printf("\nContinuati?(1 pt da)");
    scanf("%d",&d);
  }
  return 0;
}

0 个答案:

没有答案