1、项目包结构

array.h

#ifndef _ARRAY_H_

#define _ARRAY_H_

/************************************************************************/

/* 初始化数组                                                          */

/************************************************************************/

extern void initArrayStoreSpace(int **arr,int n);

/************************************************************************/

/* 初始化数组内容                                                      */

/************************************************************************/

extern void initArrayContent(int *arr, int n);

/************************************************************************/

/* 打印制定的数组                                                      */

/************************************************************************/

extern void printArrayContent(int *arr,int n);

/************************************************************************/

/*                                                                     */

/************************************************************************/

extern void freeArrayStoreSpace(int *arr);

#endif

arrayImpl.c

#include <stdio.h>

#include<stdlib.h>

#include "array.h"

/************************************************************************/

/* 由于栈的大小有限,所以这个时候要在堆上开辟空间                       */

/************************************************************************/

void initArrayStoreSpace(int **arr, int N)

{

if (N < 0)

{

printf("对不起,您要的数组大小不能小于0");

return;

}

else

{

*arr = (int *)malloc(sizeof(int)* N);

}

}

/************************************************************************/

/* 初始化数组的内容                                                    */

/************************************************************************/

void initArrayContent(int *arr, int N)

{

int i = 0;

//注意,定义变量一定要指向要给NULL,不然会报错

int *px = arr;

for (px; px < arr + N; px++)

{

*px = ++i;

}

}

/************************************************************************/

/* 打印制定的数组,将数组的值赋值成1-N                                   */

/************************************************************************/

void printArrayContent(int *arr, int N)

{

int i = 0;

int *px = arr;

for (px; px < arr + N; px++)

{

printf("%d\n", *px);

}

}

/************************************************************************/

/* 释放内存空间                                                        */

/************************************************************************/

void freeArrayStoreSpace(int *arr)

{

free(arr);

}

find.h

#ifndef _FIND_H_

#define _FIND_H_

/************************************************************************/

/* 普通方式进行查找                                                    */

/************************************************************************/

extern void find(void *p);

/************************************************************************/

/* 通过二分查找的方式进行查找                                           */

/************************************************************************/

extern void binarySearch(void *p);

#endif

findImpl.c

#include <stdio.h>

#include <stdlib.h>

#include <Windows.h>

#include "thread.h"

#include "find.h"

/************************************************************************/

/* 如果是想让线程使用,这里必须是void *p类型的                          */

/************************************************************************/

void find(void *p)

{

//指针类型转换

struct threadStruct *pstruct = (struct threadStruct *)p;

int *px = pstruct->start;

//内存的遍历,从地址开始累加100个元素的大小,遍历所有元素

for (px; px < pstruct->start + pstruct->length; px++)

{

Sleep(100);

if (*(pstruct->pflag) != 0)

{

printf("属下%d无能,其他线程已经找到", pstruct->identify);

//并且获取系统时间

//这个地方关闭线程,如果直接返回,这时候这个线程自动关闭了。

return;

}

//判断是否相等

if (*px == pstruct->num)

{

//查找

printf("\n第%d个线程找到%d,数值地址是:%p\n", pstruct->identify, *px, px);

//改变标识,代表找到

*(pstruct->pflag) = 1;

*(pstruct->addr) = px;

return;

}

}

printf("\n没有找到第%d个线程", pstruct->identify);

return;

}

/************************************************************************/

/* 通过二分查找的方式进行查找,这里有待检测                              */

/************************************************************************/

void binarySearch(void *p)

{

struct threadStruct *pstruct = (struct threadStruct *)p;

int *low = pstruct->start;

int *high = pstruct->start + pstruct->length;

while (low <= high)

{

//这里说明指针相减得到的是中间的差值

int *mid = low + ((high - low) >> 1);

if (pstruct->num < *mid)

{

high = mid - 1;

}

else if (pstruct->num > *mid)

{

low = mid + 1;

}

else

{

//找到后将标识改成1

*pstruct->pflag = 1;

*pstruct->addr = &mid;

return;

}

}

if (low > high)

{

printf("\n%d线程没有找到", pstruct->identify);

return;

}

}

thread.h

#ifndef _THREAD_H_

#define _THREAD_H_

struct threadStruct

{

int *start;    //表示要查找的首地址

int length;    //限定长度,从首地址开始只能找到后续的length个数值

int num;       //要查找的数据

int identify;  //线程的编号

int *pflag;    //传递flag的地址,通过这个指针可以修改flag的值

int **addr;    //存放所找数值所在的地址指针的地址

};

/************************************************************************/

/*为线程开辟空间                                                       */

/************************************************************************/

extern void initThreadArrayStoreSpace(struct threadStruct **threadArr, int threadnum);

/************************************************************************/

/* 初始化线程内容,第二个参数表示的是数组                              */

/************************************************************************/

extern void initThreadContent(struct threadStruct *threadArr, int len,

int *arr, int n, int targetNum, int threadnum);

/************************************************************************/

/* 打印结构体内容                                                                    */

/************************************************************************/

extern void printStructItemContent(struct threadStruct *threadArr, int n);

/************************************************************************/

/* 释放线程数组的内存空间                                              */

/************************************************************************/

extern void freeThreadStoreSpace(struct threadStruct *threadArr);

/************************************************************************/

/* 使用初始化好的线程执行查找动作                                                                    */

/************************************************************************/

extern void searchNumByMutiThread(struct threadStruct *threadArr, int n);

#endif

threadImpl.c

#include <stdio.h>

#include <stdlib.h>

#include <process.h>  //调用多线程的时候要用到的头文件

#include <Windows.h>

#include "find.h"

#include "thread.h"

/*要注意的是这里不能把变量定义在头文件中*/

/*定义是否找到的标识*/

int flag = 0;

/*这里表示数值所在位置*/

int *numAddress = NULL;

/*定义时间值*/

/************************************************************************/

/*为线程开辟空间                                                       */

/************************************************************************/

void initThreadArrayStoreSpace(struct threadStruct **threadArr, int TNUM)

{

if (TNUM < 0)

{

printf("对不起,您的线程数不能小于0.\n");

return;

}

else

{

//因为是结构体数组,所以这里的struct threadStruct类型的

*threadArr = (struct threadStruct *)malloc(sizeof(struct threadStruct) * TNUM);

}

}

/************************************************************************/

/* 初始化线程内容,第二个参数表示的是数组                              */

/************************************************************************/

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 <stdio.h>

#include <stdlib.h>

#include <crtdbg.h>        //做内存泄露检测所需的头文件

#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;

}

动态开辟指定数量的线程来查找动态开辟的数组中的1000000数据中的值相关推荐

  1. 【多线程】并发执行指定数量的线程

    有时候为了控制并发规模,我们需要对每次启动的线程做个数量上的限制,可以使用Executors.newFixedThreadPool(int)这个方法. 例子 一个线程类,运行中休息几秒为了观察现象更为 ...

  2. Struts2中动态的指定返回的结果集

    1.在Struts2中,可以在struts.xml配置文件中动态的指定返回的结果集.用${属性名}的方式取得Action类中的属性,在服务端判断好相应的跳转路径,然后存到变量里,然后再在struts. ...

  3. linux动态库路径生效,Linux下如何解决动态库的链接问题

    原标题:Linux下如何解决动态库的链接问题 静态库是一种以空间换取时间和移植性的做法,一些情况下确实有着一定的意义,但是一些情况下,我们自己编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有 ...

  4. 《线程管理:传递参数、确定线程数量、线程标识》

    参考<c++ Concurrency In Action >第二章做的笔记 目录 传递参数 量产线程 线程标识 传递参数 thread构造函数的附加参数会拷贝至新线程的内存空间中,即使函数 ...

  5. pta数据结构实验在数组中查找指定元素_如何从一个数组中查找指定的元素,并返回这个元素在数组中的位置...

    展开全部 和Vector都是使用Objec的数组形式来存储的.当你向这两种类型中增加元素的时候,如果元素的数目超出e68a84e8a2ad62616964757a686964616f313332646 ...

  6. linux动态库查找,Linux查找动态库的3种方法

    Linux查找动态库的3种方法 linux默认加载动态库的路径是 /lib或者是/lib64, 32位的系统是前者,64位是后者. 如果找不到还有3个地方 LD_LIBRARY_PATH rpath ...

  7. jquery设置div高度和easyui的dialog动态的指定高度

    2019独角兽企业重金招聘Python工程师标准>>> QUERY设定div的高度: $("div").height(300); 或者 $("div&q ...

  8. asp.net2.0中通过CS代码来动态的指定aspx页面中head中的信息

    在使用asp.net进行web开发的时候页面中的<head></head>中的信息可以通过,asp.net的cs文件动态指定,但是如果很多页面都这样处理的话,就和在aspx代码 ...

  9. java线程唤醒线程_Java中如何唤醒“指定的“某个线程

    群里有学C#转Java的小朋友问:Java中有木有一个办法唤醒一个"指定的"线程. 熟悉线程操作的小朋友应该知道,Java中线程的挂起和唤醒一般用synchronized + wa ...

最新文章

  1. 媒体行业注册什么企业邮箱比较好?
  2. 使用openpyxl处理表格数据
  3. python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器
  4. SVN客户端不显示绿色标识
  5. (转)数组指针和指针数组的区别
  6. String , StringBuffer 和 StringBuilder 区别
  7. leetcode 212. Word Search II | 212. 单词搜索 II(Trie,回溯,DFS)
  8. 新开通博客园,纪念一下。
  9. osx+配置+php扩展,Mac系统升级到10.9(mavericks)时安装php扩展问题解决
  10. 修改 decimal 默认值为0.00 sql_书写高性能SQL语句技巧,网友都说好
  11. editor.md七牛云上传图片springboot_spring boot 若依系统整合Ueditor,部署时候上传图片错误解决...
  12. 藏红花怎么推广?百度下拉词|抖音下拉词框|信息流推广-三剑合璧
  13. vue-cli初始化项目2.x|3.x
  14. 误ghost后手工修改分区表来恢复数据
  15. 51单片机的红外计数器设计
  16. 计算机中的特殊符号是什么,电脑中特殊字符怎么打出来
  17. 没有比粥更温柔的了。念予毕生流离红尘,就找不到一个似粥温柔的人。
  18. 04_turtle画奥运五环
  19. realme刷机鸿蒙教程,realmeX一键解锁BL教程(realme手机解锁BL详解教程)
  20. PPP协议讲解(PPP连接状态、PPP报文)

热门文章

  1. VTK:直纹面过滤器用法实战
  2. VTK:绘制封顶球CappedSphere用法实战
  3. wxWidgets 示例演示 wxWizard 控件
  4. boost::timer模块检查在同一程序中使用 Chrono 和 Timer 不会导致链接错误
  5. boost::with_lock_guard相关的测试程序
  6. boost::hana::map_用法的测试程序
  7. VTK:可视化算法之TubesWithVaryingRadiusAndColors
  8. VTK:可视化之CubeAxesActor2D
  9. VTK:IO之ReadCML
  10. OpenCV为轮廓创建边界旋转框和椭圆