• 61.多线程检索内存


      1 #define _CRT_SECURE_NO_WARNINGS
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include <string.h>
      5 #include <memory.h>
      6 #include <process.h>
      7 #include <Windows.h>
      8 
      9 char *path = "dangdangwang.txt";
     10 
     11 #define N 13180820
     12 
     13 //存储所有的行的信息
     14 char ** g_pp;
     15 //创建线程的数组
     16 struct threads *pthread;
     17 
     18 //初始化全局变量g_pp
     19 void  init(char *path)
     20 {
     21     printf("init start");
     22     g_pp = malloc(sizeof(char*)*N);
     23     memset(g_pp, '', sizeof(char*)*N);//清空内容
     24     FILE *pf = fopen(path, "r");
     25 
     26     if (pf==NULL)
     27     {
     28         printf("init  fail");
     29     } 
     30     else
     31     {
     32         for (int i = 0; i < N;i++)
     33         {
     34             char str[1024] = { 0 };
     35             //读取字符串
     36             fgets(str, 1024, pf);
     37             //获取长度
     38             int length = strlen(str);
     39             if (length >= 1)
     40             {
     41                 //分配内存
     42                 g_pp[i] = malloc(sizeof(char)*(length + 1));
     43                 //清空内容
     44                 memset(g_pp[i], '', length + 1);
     45                 if (g_pp[i]!=NULL)
     46                 {
     47                     //拷贝
     48                     strcpy(g_pp[i], str);
     49                 }
     50             }
     51         }
     52         fclose(pf);
     53     }
     54     printf("init end");
     55 }
     56 
     57 //线性查找
     58 void  search(char*str)
     59 {
     60 
     61     for (int i = 0; i < N;i++)
     62     {
     63         if (g_pp[i]!=NULL)
     64         {
     65             char *p = strstr(g_pp[i], str);
     66             if (p != NULL)
     67             {
     68                 printf("%s
    ", g_pp[i]);//找到打印
     69             }
     70         }    
     71     }
     72 }
     73 
     74 //创建线程数组
     75 struct threads
     76 {
     77     //指针数组的起始地址,指向的是一部分字符串,所以是二级指针
     78     //(二级指针指向很多个一级指针)
     79     char **ppstart;
     80     //负责索引的长度
     81     int length;
     82     //线程编号
     83     int id;
     84     //查找的字符串
     85     char *pstr;
     86 };
     87 
     88 //线程查找,传递的是线程结构体的信息
     89 void searchthread(void *p)
     90 {
     91     //类型转换
     92     struct threads *pinfo = p;
     93     //遍历查找
     94     for (int i = 0; i < pinfo->length;i++)
     95     {
     96         if (pinfo->ppstart[i]!=NULL)
     97         {
     98             char *p = strstr(pinfo->ppstart[i], pinfo->pstr);//查找
     99             if (p!=NULL)
    100             {
    101                 printf("线程%d找到%s
    ", pinfo->id,pinfo->ppstart[i]);//找到
    102             }
    103         }
    104     }
    105 }
    106 
    107 //创建线程,并且查找
    108 void  searchwiththread(char*str)
    109 {
    110     //线程是CPU核心的倍数
    111     int num = 23;
    112     //堆上开辟,线程结构体的信息
    113     pthread = malloc(sizeof(struct threads) * 23);
    114     //内存清零
    115     memset(pthread, '', sizeof(struct threads )* 23);
    116     //线程句柄分配内存
    117     HANDLE *phd = malloc(sizeof(HANDLE) * 23);
    118 
    119     //如果能够整除
    120     if (N%num == 0)
    121     {
    122         for (int i = 0; i < num;i++)
    123         {
    124             pthread[i].id = i;
    125             pthread[i].pstr = str;
    126             //长度分配
    127             pthread[i].length = N/num; 
    128             //起始地址
    129             pthread[i].ppstart = g_pp+i*(N/num);
    130             //创建线程
    131             phd[i] = _beginthread(searchthread, 0, &pthread[i]);
    132         }
    133     } 
    134     //如果不能被整除
    135     else
    136     {
    137         for (int i = 0; i < num-1; i++)
    138         {
    139             pthread[i].id = i;
    140             pthread[i].pstr = str;
    141             pthread[i].length = N / (num-1); 
    142             //起始地址
    143             pthread[i].ppstart = g_pp + i*(N / (num-1));
    144             //创建线程
    145             phd[i] = _beginthread(searchthread, 0, &pthread[i]);
    146         }
    147         //处理最后一个
    148         {
    149             int i = num - 1;
    150             pthread[i].id = i;
    151             pthread[i].pstr = str;
    152             pthread[i].length = N%(num-1);
    153             //起始地址
    154             pthread[i].ppstart = g_pp + i*(N / (num - 1));
    155             //创建线程
    156             phd[i] = _beginthread(searchthread, 0, &pthread[i]);
    157         }
    158     }
    159     //等待所有线程退出
    160     WaitForMultipleObjects(num, phd, TRUE, INFINITE);
    161 }
    162 
    163 //获取文件有多少行
    164 int getN(char *path)
    165 {
    166     FILE *pf = fopen(path, "r");
    167     if (pf == NULL)
    168     {
    169         return -1;
    170     }
    171     else
    172     {
    173         int i = 0;
    174         while (!feof(pf))
    175         {
    176             char str[256] = { 0 };
    177             fgets(str, 256, pf);
    178             i++;
    179         }
    180         fclose(pf);
    181         return i;
    182     }
    183 }
    184 
    185 void main()
    186 {
    187     //初始化全局变量g_pp
    188     init(path);
    189     while (1)
    190     {
    191         char str[128] = { 0 };
    192         scanf("%s", str);
    193         //多线程查找
    194         searchwiththread(str);
    195     }
    196     system("pause");
    197 }
  • 相关阅读:
    iOS开发技巧,细节
    一个PO审批的自动触发问题
    SAP Workflow(一)
    【S4 导数据】S/4HANA导数,只会LSMW远远不够(转)
    【MM】采购订单文本(二)
    【MM】 采购订单长文本(一)
    SAP Create Background Job定义后台作业
    No.595-Big Countries-(LeetCode之Database篇)
    设计模式之单例模式
    你一定能看懂的JDK动态代理
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8437198.html
Copyright © 2020-2023  润新知