设为首页 加入收藏

TOP

动态开辟指定数量的线程来查找动态开辟的数组中的1000000数据中的值(三)
2015-07-20 18:03:02 来源: 作者: 【 】 浏览:7
Tags:动态 开辟 指定 数量 线程 查找 1000000 数据
*********************************************************/

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;

}

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDOJ 4883 TIANKENG’s restaurant 下一篇uva 11290 - Gangs(卡特兰数)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: