多线程检索数据

来源:互联网 发布:二手交易平台php源码 编辑:程序博客网 时间:2024/05/17 08:36

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


/*多线程检索数据,如果有线程检索到相应的数据,其它线程则就不在查询直接退出相应检索。*/#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>#include<Windows.h>#include<process.h>#define M 100#defineN 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 findinfoinfo[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