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 //释放内存 10 //内存不够的情况,排队完成任务 11 12 //创建多线程结构体 13 struct infos 14 { 15 //路径 16 char path[256]; 17 //线程id 18 int id; 19 //把文件的内容载入 20 char **g_pp; 21 //文件的长度 22 int length; 23 //要查询的数据 24 char findstr[100]; 25 }myinfo[22] = {0};//22个结构体保存了22个文件的信息 26 HANDLE inithd[22] = {0};//22个初始化线程地址 27 HANDLE findhd[22] = { 0 };//22个查找线程地址 28 29 //根据路径初始化线程地址,把数据写入到infos结构体中 30 void runthreadinit(void *p) 31 { 32 struct infos *pinfo = p; 33 FILE *pf = fopen(pinfo->path, "r"); 34 if (pf!=NULL) 35 { 36 //测试多少行 37 int i = 0; 38 while (!feof(pf)) 39 { 40 char str[256] = { 0 }; 41 fgets(str, 256, pf);//读取 42 i++; 43 } 44 //i记录行数 45 rewind(pf);//回到开头 fseek(pf,0,SEEK_SET); 46 pinfo->g_pp = calloc(i, sizeof(char*));//分配内存初始化 47 pinfo->length = i;//记录长度 48 49 //读取并把数据拷贝到g_pp[i]中 50 for (int j = 0; j < i;j++) 51 { 52 char str[256] = { 0 }; 53 //读取 54 fgets(str, 256, pf); 55 //获取长度 56 int length = strlen(str); 57 //分配内存 58 pinfo->g_pp[j] = calloc(length + 1, sizeof(char)); 59 //拷贝到**g_pp中 60 if (pinfo->g_pp[j]!=NULL) 61 { 62 strcpy(pinfo->g_pp[j], str); 63 } 64 } 65 } 66 //关闭文件 67 fclose(pf); 68 printf("线程%d init over ", pinfo->id); 69 } 70 71 //调用线程函数 72 void runthreadsearch(void *p) 73 { 74 //指针类型转换 75 struct infos *pinfo = p; 76 //每个线程都进行相应的检索 77 for (int i = 0; i < pinfo->length;i++) 78 { 79 if (pinfo->g_pp[i]!=NULL) 80 { 81 char *px = strstr(pinfo->g_pp[i], pinfo->findstr); 82 if (px!=NULL) 83 { 84 printf(" %s", pinfo->g_pp[i]); 85 } 86 } 87 } 88 89 printf("线程%d find over ", pinfo->id); 90 } 91 92 //释放内存 93 void freeall(struct infos *pinfo) 94 { 95 printf("freeall start"); 96 //释放指针数组每一个指针对于的内存 97 for (int i = 0; i < pinfo->length;i++) 98 { 99 free(pinfo->g_pp[i]); 100 } 101 free(pinfo->g_pp);//释放g_pp 102 103 printf("freeall end;"); 104 105 } 106 107 void main() 108 { 109 //给线程结构体初始化地址和要查询的字符串 110 for (int i = 0; i < 15;i++) 111 { 112 myinfo[i].id = i+1; 113 sprintf(myinfo[i].path, "dangdangwang%d.txt", i + 1); 114 strcpy(myinfo[i].findstr, "小王"); 115 } 116 117 //根据地址初始化结构体 118 for (int i = 0; i < 15;i++) 119 { 120 inithd[i] = _beginthread(runthreadinit, 0, &myinfo[i]); 121 } 122 //等待 123 WaitForMultipleObjects(15, inithd, TRUE, INFINITE); 124 system("pause"); 125 126 //执行查找线程 127 for (int i = 0; i < 15;i++) 128 { 129 findhd[i] = _beginthread(runthreadsearch, 0, &myinfo[i]); 130 } 131 //等待 132 WaitForMultipleObjects(15, findhd, TRUE, INFINITE); 133 system("pause"); 134 135 //释放所有内存 136 printf("开始释放"); 137 for (int i = 0; i < 15;i++) 138 { 139 freeall(&myinfo[i]); 140 } 141 printf("结束释放"); 142 143 system("pause"); 144 }