多线程查询数据:
此处主要是对内存与数据的联系的理解,如使用到的地二级指针
#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");
}