多线程查找数据-1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<process.h>
#include<Windows.h>
int flag = 0;//全局变量,用于线程通信
/*
检索参数结构体
*/
struct fundinfo
{
int* pStart;//数据首地址
int length;//检索数据长度
int value;//检索的值
int id;//线程编号
};
/*
检索函数
*/
void findValue(void* vPtr)
{
struct fundinfo* p = vPtr;
printf("----------线程【%d】开始查找: ----------\n\n", p->id);
//遍历指定长度地址元素
for (int* pf = p->pStart; pf < (p->pStart) + (p->length); pf++)
{
if (flag)
{
printf("----------其他线程已经找到,线程【%d】不再检索查找! ----------\n\n", p->id);
return;
}
if (*pf == p->value)
{
printf("线程【%d】查找结束,找到数据: %d ; 地址:%p \n\n", p->id,*pf,pf);
flag = 1;
return;//每个指定数据长度 找到一个就退出,如果全部查找,去掉 return
}
}
printf("----------线程【%d】没有找到 ----------\n\n", p->id);
//Sleep(300);
}
void main()
{
printf("\n---------- 源数据 ----------\n\n");
int arr[100] = { 0 };
time_t ts;
unsigned int num = time(&ts);
srand(num);
for (int i = 0; i < 100; i++)
{
arr[i] = rand() % 100;
printf("%4d", arr[i]);
if ((i + 1) % 10 == 0)
{
printf("\n");
}
}
printf("\n---------- 源数据 ----------\n\n");
printf("请输入要查找的数据:\n");
int input;//输入数据,进行检索
scanf("%d", &input);
struct fundinfo info[10];
//方法1:
for (int i = 0; i < 10; i++)
{
info[i].pStart = arr + 10 * i; //首地址
info[i].length = 10;
info[i].id = i;
info[i].value = input;
HANDLE hd= _beginthread(findValue, 0, &info[i]);//调用线程
//WaitForSingleObject(hd, INFINITE);//同步执行
}
system("pause");
}
多线程查找数据-2
数据均等切割和线程切割
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<process.h>
#include<Windows.h>
int flag = 0; //全局变量,用于线程通信
#define M 100 //数据长度
#define N 8 //线程数量 是CPU核心数的倍数
/*
线程切割: 总线程 8 个 = 7 个线程处理均等数据 + 1个线程处理额外数据
数据切割: M/(N-1)=100/7 =14 (7个均等数据) 14*7=98 ,剩余 2 : M%(N-1)=100%7=2 单独线程处理
*/
/*
检索参数结构体
*/
struct fundinfo
{
int* pStart;//数据首地址
int length;//检索数据长度
int value;//检索的值
int id;//线程编号
};
/*
检索函数
*/
void findValue(void* vPtr)
{
struct fundinfo* p = vPtr;
printf("----------线程【%d】开始查找: ----------\n\n", p->id);
//遍历指定长度地址元素
for (int* pf = p->pStart; pf < (p->pStart) + (p->length); pf++)
{
if (flag)
{
printf("----------其他线程已经找到,线程【%d】不再检索查找! ----------\n\n", p->id);
return;
}
if (*pf == p->value)
{
printf("线程【%d】查找结束,找到数据: %d ; 地址:%p \n\n", p->id, *pf, pf);
flag = 1;
return;//每个指定数据长度 找到一个就退出,如果全部查找,去掉 return
}
}
printf("----------线程【%d】没有找到 ----------\n\n", p->id);
}
void main()
{
printf("\n---------- 源数据 ----------\n\n");
int arr[M] = { 0 };
time_t ts;
unsigned int num = time(&ts);
srand(num);
for (int i = 0; i < 100; i++)
{
arr[i] = rand() % 100;
printf("%4d", arr[i]);
if ((i + 1) % 10 == 0)
{
printf("\n");
}
}
printf("\n---------- 源数据 ----------\n\n");
printf("请输入要查找的数据:\n");
int input;//输入数据,进行检索
scanf("%d", &input);
struct fundinfo info[N];
if (M % N == 0)//理想状态 均等切割
{
for (int i = 0; i < N; i++)
{
info[i].pStart = arr + (M/N) * i; //首地址
info[i].length = M/N;
info[i].id = i;
info[i].value = input;
HANDLE hd = _beginthread(findValue, 0, &info[i]);//调用线程
//WaitForSingleObject(hd, INFINITE);//同步执行
}
}
else
{
for (int i = 0; i < N-1; i++)//前 7个线程
{
info[i].pStart = arr + (M / (N-1)) * i; //首地址
info[i].length = M / (N-1);
info[i].id = i;
info[i].value = input;
HANDLE hd = _beginthread(findValue, 0, &info[i]);//调用线程
//WaitForSingleObject(hd, INFINITE);//同步执行
}
//处理剩下数
int i = N - 1;
info[i].pStart = arr + (M / (N - 1)) * i; //首地址
info[i].length = M % (N - 1); //长度变化
info[i].id = i;
info[i].value = input;
HANDLE hd = _beginthread(findValue, 0, &info[i]);//调用线程
}
system("pause");
}