多线程查询数据,第一种方法是可以整除的数组,后面是对上面代码的完善。
/*
多线程检索数据,如果有线程检索到相应的数据,其它线程则就不在查询直接退出相应检索。
*/
#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");
}