多线程检索数据

多线程查询数据,第一种方法是可以整除的数组,后面是对上面代码的完善。


/*
	多线程检索数据,如果有线程检索到相应的数据,其它线程则就不在查询直接退出相应检索。
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
#include<process.h>

#define M 100
#define	N 10
//7 1
//100/7= 14  M/(N-1)  7×14+2   M%(N-1)

int isfind = 0; //全局变量

struct findinfo
{
	int *pstart;	//每次检索数据的首地址
	int length;		//长度(每个线程检索的数据长度)
	int findnum;	//要查找的数据
	int id;			//线程编号
};

void findit(void *p)
{
	struct findinfo *info = (struct findinfo *)p;	//保存结构体地址
	
	for (int *pf = info->pstart; pf < info->pstart + info->length;pf++)
	{
		//每查索一次就查询一下查询状态,如果有线程检索成功,则退出
	/*	if (isfind)
		{
			printf("数据已检索到!\n");
			return;
		}*/
		if (*pf == info->findnum)
		{
			printf("线程 %0 3d 找到检索到数据:%0 3d  地址是:%p\n", info->id, *pf, info->pstart);
			isfind = 1;
			return;
		}
	}
	//printf("线程 %d 没有找到检索到数据。\n", info->id);
	return;
	//for (int i = 0; i < info->length; i++)
	//{
	//	if (info->findnum == *(info->pstart))
	//	{
	//		printf("线程 %d 检索到相应数据!\n",info->id);

	//		return;
	//	}
	//	info->pstart++;		//地址前移
	//}
}


void main()
{
	int a[M] = { 0 };

	time_t ts;
	unsigned int data = time(&ts);
	srand(data);
	
	for (int i = 0; i < M; i++)
	{
		a[i] = rand() % 100;
	}
	printf("\n");
	int line = 1;
	printf(" 第 %0 3d 行:", line);
	for (int j = 0; j < M; j++)
	{
		printf("%0 3d", a[j]);
		if ((j + 1) % 10 == 0 )
		{			
			line++;
			printf("\n");
			if (line <= M / 10)
				printf(" 第 %0 3d 行:", line);
		}		
	}

	int num;
	printf("\n请输入要查询的数据:");
	scanf("%d", &num);

	struct findinfo	info[N];	//结构体


		for (int i = 0; i < N ; i++)
		{
			//初始化结构体
			info[i].pstart = a + M/N* i;	//查询的首地址
			info[i].length = M/N;	//查询数据的长度
			info[i].id = i;			//线程的编号
			info[i].findnum = num;	//要查询的数据
			HANDLE hd = _beginthread(findit, 0, &info[i]);	//调用线程
			//同步
			//WaitForSingleObject(hd, INFINITE);
		}

	//
		Sleep(1000);
		int sum = 0;
		printf("\n查询的数据在:\n");
		for (int i = 0; i < M; i++)
		{
			if (num == a[i])
			{
				printf("第 %0 3d 位 \n", i);
				sum++;
			}
		}
		if (sum)
			printf("共查询到数据为 %d 个。", sum);
	
	system("pause");

}




//	多线程检索数据,如果有线程检索到相应的数据,其它线程则就不在查询直接退出相应检索。
//	分为可以整除不可以整除二种情况。
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
#include <process.h>

int isfind = 0;

struct findinfo
{
	int *pstart;//首地址
	int length;//长度
	int findnum;//要查找的数据
	int id;//编号
};


#define  M 100  //数据
#define  N  8     //线程数量
//7 1
//100/7= 14  M/(N-1)  7×14+2   M%(N-1)

void findit(void *p)
{
	struct findinfo *ps = p;//保存地址
	//printf("\n线程%d开始查找", ps->id);
	//遍历首地址,长度10个元素
	for (int *pf = ps->pstart; pf < ps->pstart + ps->length; pf++)
	{
		/*if (isfind == 1)
		{
			printf("\n线程%d结束查找,其他线程已经找到", ps->id);
			return;
		}*/

		if (*pf == ps->findnum)//相等
		{
			printf("线程 %d 查找找到数据 %d 地址 %p\n", ps->id, *pf, pf);
			/*isfind = 1;
			return;*/
		}
	}
	//printf("\n线程%d结束查找,没有找到", ps->id);
}

void main()
{
	int a[M] = { 0 };
	time_t ts;
	unsigned int data = time(&ts);
	srand(data);

	for (int i = 0; i < 100; i++)
	{
		a[i] = rand() % 100;
		printf("%4d", a[i]);
		if ((i + 1) % 10 == 0)
		{
			printf("\n");
		}
	}

	int num;
	scanf("%d", &num);//要查找的数据
	struct findinfo info[N];//结构体数组
	if (M%N == 0)
	{
		for (int i = 0; i < N; i++)
		{
			info[i].pstart = a + M / N * i;//首地址
			info[i].length = M / N;
			info[i].id = i;
			info[i].findnum = num;
			HANDLE hd = _beginthread(findit, 0, &info[i]);//调用线程
			//WaitForSingleObject(hd, INFINITE);
		}
	}
	else
	{
		for (int i = 0; i < N - 1; i++)
		{
			info[i].pstart = a + M / (N - 1) * i;//首地址
			info[i].length = M / (N - 1);
			info[i].id = i;
			info[i].findnum = num;
			HANDLE hd = _beginthread(findit, 0, &info[i]);//调用线程
			//WaitForSingleObject(hd, INFINITE);
		}
		//info[N-1];
		int i = N - 1;
		info[i].pstart = a + M / (N - 1) * i;//首地址
		info[i].length = M % (N - 1);
		info[i].id = i;
		info[i].findnum = num;
		HANDLE hd = _beginthread(findit, 0, &info[i]);//调用线程
		//WaitForSingleObject(hd, INFINITE);
	}

	Sleep(5000);
	int sum = 0;
	printf("\n查询的数据在:\n");
	for (int i = 0; i < M; i++)
	{
		if (num == a[i])
		{
			printf("第 %0 3d 位 \n", i);
			sum++;
		}
	}
	if (sum)
		printf("共查询到数据为 %d 个。", sum);
	
	system("pause");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值