多线程查询数据

本文介绍了一种基于多线程技术实现的大规模数据查询方案。通过将数据集分割为多个部分并行处理,有效提高了查询效率。文章详细阐述了内存分配、数据初始化及线程间数据交互等关键技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程查询数据:

此处主要是对内存与数据的联系的理解,如使用到的地二级指针

#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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值