*********************************************************/
void initThreadContent(struct threadStruct *threadArr, int LENGTH,
int *arr, int N, int targetNum, int TNUM)
{
int i = 0;
struct threadStruct *px = threadArr;
for (px; px < threadArr + TNUM;px++)
{
//指向数组地址(注意这里的int *)
px->start = arr + i * LENGTH;
if (N - i * LENGTH >= LENGTH)
{
//定义每个所寻数组的大小
px->length = LENGTH;
}
else
{
//定义每个所寻数组的大小
px->length = N - i * LENGTH;
}
//定义线程要查找的内容
px->num = targetNum;
//每个线程的标识id
px->identify = i;
//是否找的标识的地址
px->pflag = &flag;
//存放元素所在位置的地址
px->addr = &numAddress;
//通过下面这句查看进程编号
//printf("\n%d\n",px->identify);
//Sleep(100);
//_beginthread(find,0, &px);
i++;
}
}
/************************************************************************/
/* 打印每个结构体的内容 */
/************************************************************************/
void printStructItemContent(struct threadStruct *threadArr, int n)
{
//注意,定义变量一定要指向要给NULL,不然会报错
struct threadStruct *px = threadArr;
for (px; px < threadArr + n; px++)
{
printf("\n\n指向第一个位置的值是:%d\n", *px->start);
printf("结构体id=%d,指向的数组地址start = %p,搜寻范围length = %d\n",px->identify,px->start,px->length);
printf("查找目标值num=%d,标识的地址&flag = %p,存放元素所在位置的地址addr = %p\n\n", px->num, px->pflag, px->addr);
}
//第二种方式打印
//for (i = 0; i < n;i++)
//{
// printf("\n指向的数组地址:%p,", threadArr[i].start);
//}
}
/************************************************************************/
/* 释放线程数组的内存空间 */
/************************************************************************/
void freeThreadStoreSpace(struct threadStruct *threadArr)
{
free(threadArr);
}
/************************************************************************/
/* 使用开辟的线程进行查找 */
/************************************************************************/
void searchNumByMutiThread(struct threadStruct *threadArr, int n)
{
//这里的n表示开辟n个线程
int i;
for (i = 0; i < n;i++)
{
_beginthread(find,0,&threadArr[i]);
}
}
main.c
#include
#include
#include
//做内存泄露检测所需的头文件
#include "array.h"
#include "thread.h"
#include "windows.h"
#define _CRTDBG_MAP_ALLOC //开启内存检测
#define N 1000000 //定义数组的大小
#define TNUM 100 //定义TNUM的线程
#define LENGTH 10000 //定义每个线程能够查找的数组的长度(注意:N <= TNUM * LENGTH)
#define TARGETNUM 1000 //要查找的目标数值
int main(int argc, char *argv[])
{
//要注意的定义一个指针,一般的是要给它指向NULL,避免野指针
int *arr = NULL;
//堆上开辟数组空间,注意,如果要修改一段内存的值,要把指针的地址传递进去。
initArrayStoreSpace(&arr, N);
//初始化数组内容
initArrayContent(arr, N);
//定义线程
struct threadStruct * threadArr;
//为线程开辟空间
initThreadArrayStoreSpace(&threadArr, TNUM);
//初始化线程内容
initThreadContent(threadArr, LENGTH, arr,N, TARGETNUM, TNUM);
//打印数组内容
//printArrayContent(arr, N);
printStructItemContent(threadArr, TNUM);
//获取当前时间
//传递数组的时候传递数组的名称就可以了。
searchNumByMutiThread(threadArr,TNUM);
//注意,如果没有考虑线程同步和死锁问题,这里要设置休眠时间,
//否则会将数组的内容释放。导致错误出现。
Sleep(100000);
//释放线程数组的内存空间
freeThreadStoreSpace(threadArr);
//释放数组所占的内存空间
freeArrayStoreSpace(arr);
//printf("\n\n%d,%p\n\n", *numAddress,numAddress);//打印地址,还有数据
//加上这一句之后在启动调试后的输出窗口中看是否有内存泄露
_CrtDumpMemoryLeaks();
system("pause");
return 0;
}