多线程查询数据:
此处主要是对内存与数据的联系的理解,如使用到的地二级指针
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<Windows.h> #include<string.h> #include<process.h> #define N 2027358 char **g_bh; void init(char *path) { //初始化 printf("init start...\n"); g_bh = malloc(sizeof(char *)*N); //分配内存 //初始化时这儿不小心把 '\0' 写成了 "\0",结果造成了意想不到的程序崩溃... //memset(g_bh, "\0", sizeof(char *)*N); memset(g_bh, '\0', sizeof(char *)*N); //初始化 FILE *pfr = fopen(path, "r"); if (pfr == NULL) { return; } else { for (int i = 0; i < N; i++) { char str[1024] = { 0 }; fgets(str, 1024, pfr); int length = strlen(str); if (length >= 1) { g_bh[i] = malloc(sizeof(char)*length + 1); memset(g_bh[i], '\0', length + 1); //初始化 if (g_bh[i] != NULL) //如果内存分配成功则拷贝数据 { strcpy(g_bh[i], str); } } } } fclose(pfr); printf("init end\n"); } typedef struct threadBH { char **ppstart; //记录数据的开始地址 char *findstr; //保存查询的数据 int id; //记录线程的编号 int length; //每个线程查询的数据长度 } bh,*Pbh; void searchthread(void *p) { //转换数据类型 Pbh pbh = p; //利用传递的参数进行数据查询 for (int i = 0; i < pbh->length; i++) { if (pbh->ppstart[i]) { char *res = strstr(pbh->ppstart[i], pbh->findstr); if (res) { printf("线程:%d 查询到,%s\n", pbh->id, pbh->ppstart[i]); } } } } 使用多线程查询数据 void searchwiththread(char *str) { int sum = 23; //设置有 23 个线程,设置线程最好是CPU的倍数 //因为这儿要把 Pbh pbh= malloc(sizeof(bh)*sum); memset(pbh, '\0', sizeof(bh)*sum); HANDLE *phd = malloc(sizeof(HANDLE)* 23); //这个相当于 int ** if (N%sum == 0) { for (int i = 0; i < sum; i++) { pbh[i].findstr = str; pbh[i].id = i; pbh[i].length = N / sum; pbh[i].ppstart = g_bh + i*(N / sum); phd[i] = _beginthread(searchthread, 0, &pbh[i]); } } else { for (int i = 0; i < sum-1; i++) { pbh[i].findstr = str; pbh[i].id = i; pbh[i].length = N / (sum-1); pbh[i].ppstart = g_bh + i*(N / (sum - 1)); phd[i] = _beginthread(searchthread, 0, &pbh[i]); } { int i = sum - 1; pbh[i].findstr = str; pbh[i].id = i; pbh[i].length = N % (sum - 1); pbh[i].ppstart = g_bh + i*(N / (sum - 1)); phd[i] = _beginthread(searchthread, 0, &pbh[i]); } } WaitForMultipleObjects(sum, phd, TRUE, INFINITE); } //void searchwiththread(char*str) //{ // int num = 23;//线程是CPU核心的倍数 // Pbh pbh = malloc(sizeof(bh)* 23);//堆上开辟 // memset(pbh, '\0', sizeof(bh)* 23); // HANDLE *phd = malloc(sizeof(HANDLE) * 23); // // if (N%num==0) // { // for (int i = 0; i < num;i++) // { // pbh[i].id = i; // pbh[i].findstr = str; // pbh[i].length = N / num;//100 5 // pbh[i].ppstart = g_bh + i*(N / num);//起始地址 // phd[i] = _beginthread(searchthread, 0, &pbh[i]);//创建线程 // // } // // } // else // { // //100 9 8×12+4 // for (int i = 0; i < num-1; i++) // { // pbh[i].id = i; // pbh[i].findstr = str; // pbh[i].length = N / (num - 1);//100 5 // pbh[i].ppstart = g_bh + i*(N / (num - 1));//起始地址 // phd[i] = _beginthread(searchthread, 0, &pbh[i]);//创建线程 // // } // { // int i = num - 1; // pbh[i].id = i; // pbh[i].findstr = str; // pbh[i].length = N % (num - 1);//100 5 // pbh[i].ppstart = g_bh + i*(N / (num - 1));//起始地址 // phd[i] = _beginthread(searchthread, 0, &pbh[i]);//创建线程 // //0 8*12 // } // // } // // WaitForMultipleObjects(23, phd, TRUE, INFINITE);//等待所有线程退出 // //} char *path = "E:\\baihe.txt"; void main() { //Sleep(5000); init(path); while (1) { printf("请输入要查询的名字:"); char name[30]; scanf("%s", name); searchwiththread(name); } system("pause"); }
