C语言: 多线程示例

多线程查找数据-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");
}

在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值