动态开辟指定数量的线程来查找动态开辟的数组中的1000000数据中的值
1、項(xiàng)目包結(jié)構(gòu)
array.h
#ifndef _ARRAY_H_
#define _ARRAY_H_
?
/************************************************************************/
/* 初始化數(shù)組??????????????????????????????????????????????????????????*/
/************************************************************************/
extern void initArrayStoreSpace(int **arr,int n);
?
/************************************************************************/
/* 初始化數(shù)組內(nèi)容??????????????????????????????????????????????????????*/
/************************************************************************/
extern void initArrayContent(int *arr, int n);
?
/************************************************************************/
/* 打印制定的數(shù)組??????????????????????????????????????????????????????*/
/************************************************************************/
extern void printArrayContent(int *arr,int n);
?
/************************************************************************/
/*?????????????????????????????????????????????????????????????????????*/
/************************************************************************/
extern void freeArrayStoreSpace(int *arr);
?
#endif
arrayImpl.c
#include <stdio.h>
#include<stdlib.h>
#include "array.h"
?
/************************************************************************/
/* 由于棧的大小有限,所以這個(gè)時(shí)候要在堆上開辟空間?????????????????????? */
/************************************************************************/
void initArrayStoreSpace(int **arr, int N)
{
??? if (N < 0)
??? {
??????? printf("對(duì)不起,您要的數(shù)組大小不能小于0");
??????? return;
??? }
??? else
??? {
??????? *arr = (int *)malloc(sizeof(int)* N);
??? }
}
?
/************************************************************************/
/* 初始化數(shù)組的內(nèi)容????????????????????????????????????????????????????*/
/************************************************************************/
void initArrayContent(int *arr, int N)
{
??? int i = 0;
??? //注意,定義變量一定要指向要給NULL,不然會(huì)報(bào)錯(cuò)
??? int *px = arr;
??? for (px; px < arr + N; px++)
??? {
??????? *px = ++i;
??? }
}
?
/************************************************************************/
/* 打印制定的數(shù)組,將數(shù)組的值賦值成1-N?????????????????????????????????? */
/************************************************************************/
void printArrayContent(int *arr, int N)
{
??? int i = 0;
??? int *px = arr;
??? for (px; px < arr + N; px++)
??? {
??????? printf("%d\n", *px);
??? }
}
?
/************************************************************************/
/* 釋放內(nèi)存空間????????????????????????????????????????????????????????*/
/************************************************************************/
void freeArrayStoreSpace(int *arr)
{
??? free(arr);
}
find.h
#ifndef _FIND_H_
#define _FIND_H_
?
/************************************************************************/
/* 普通方式進(jìn)行查找????????????????????????????????????????????????????*/
/************************************************************************/
extern void find(void *p);
?
/************************************************************************/
/* 通過二分查找的方式進(jìn)行查找?????????????????????????????????????????? */
/************************************************************************/
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)
{
??? //指針類型轉(zhuǎn)換
??? struct threadStruct *pstruct = (struct threadStruct *)p;
??? int *px = pstruct->start;
??? //內(nèi)存的遍歷,從地址開始累加100個(gè)元素的大小,遍歷所有元素
??? for (px; px < pstruct->start + pstruct->length; px++)
??? {
??????? Sleep(100);
??????? if (*(pstruct->pflag) != 0)
??????? {
??????????? printf("屬下%d無(wú)能,其他線程已經(jīng)找到", pstruct->identify);
??????????? //并且獲取系統(tǒng)時(shí)間
?
??????????? //這個(gè)地方關(guān)閉線程,如果直接返回,這時(shí)候這個(gè)線程自動(dòng)關(guān)閉了。
??????????? return;
??????? }
?
??????? //判斷是否相等
??????? if (*px == pstruct->num)
??????? {
??????????? //查找
??????????? printf("\n第%d個(gè)線程找到%d,數(shù)值地址是:%p\n", pstruct->identify, *px, px);
??????????? //改變標(biāo)識(shí),代表找到
??????????? *(pstruct->pflag) = 1;
??????????? *(pstruct->addr) = px;
??????????? return;
??????? }
?
??? }
??? printf("\n沒有找到第%d個(gè)線程", pstruct->identify);
?
??? return;
}
?
/************************************************************************/
/* 通過二分查找的方式進(jìn)行查找,這里有待檢測(cè)????????????????????????????? */
/************************************************************************/
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
??????? {
??????????? //找到后將標(biāo)識(shí)改成1
??????????? *pstruct->pflag = 1;
??????????? *pstruct->addr = ∣
??? ??????? return;
??????? }
??? }
??? if (low > high)
??? {
??????? printf("\n%d線程沒有找到", pstruct->identify);
??????? return;
??? }
}
thread.h
#ifndef _THREAD_H_
#define _THREAD_H_
?
struct threadStruct
{
??? int *start;??? //表示要查找的首地址
??? int length;??? //限定長(zhǎng)度,從首地址開始只能找到后續(xù)的length個(gè)數(shù)值
??? int num;?????? //要查找的數(shù)據(jù)
??? int identify;? //線程的編號(hào)
??? int *pflag;??? //傳遞flag的地址,通過這個(gè)指針可以修改flag的值
??? int **addr;??? //存放所找數(shù)值所在的地址指針的地址
};
?
/************************************************************************/
/*為線程開辟空間???????????????????????????????????????????????????????*/
/************************************************************************/
extern void initThreadArrayStoreSpace(struct threadStruct **threadArr, int threadnum);
?
/************************************************************************/
/* 初始化線程內(nèi)容,第二個(gè)參數(shù)表示的是數(shù)組??????????????????????????????*/
/************************************************************************/
extern void initThreadContent(struct threadStruct *threadArr, int len,
??? int *arr, int n, int targetNum, int threadnum);
?
/************************************************************************/
/* 打印結(jié)構(gòu)體內(nèi)容????????????????????????????????????????????????????????????????????*/
/************************************************************************/
extern void printStructItemContent(struct threadStruct *threadArr, int n);
?
/************************************************************************/
/* 釋放線程數(shù)組的內(nèi)存空間??????????????????????????????????????????????*/
/************************************************************************/
extern void freeThreadStoreSpace(struct threadStruct *threadArr);
?
/************************************************************************/
/* 使用初始化好的線程執(zhí)行查找動(dòng)作????????????????????????????????????????????????????????????????????*/
/************************************************************************/
extern void searchNumByMutiThread(struct threadStruct *threadArr, int n);
?
#endif
?
threadImpl.c
#include <stdio.h>
#include <stdlib.h>
#include <process.h>? //調(diào)用多線程的時(shí)候要用到的頭文件
#include <Windows.h>
#include "find.h"
#include "thread.h"
?
/*要注意的是這里不能把變量定義在頭文件中*/
/*定義是否找到的標(biāo)識(shí)*/
int flag = 0;
/*這里表示數(shù)值所在位置*/
int *numAddress = NULL;
/*定義時(shí)間值*/
?
/************************************************************************/
/*為線程開辟空間???????????????????????????????????????????????????????*/
/************************************************************************/
void initThreadArrayStoreSpace(struct threadStruct **threadArr, int TNUM)
{
??? if (TNUM < 0)
??? {
??????? printf("對(duì)不起,您的線程數(shù)不能小于0.\n");
??????? return;
??? }
??? else
??? {
??????? //因?yàn)槭墙Y(jié)構(gòu)體數(shù)組,所以這里的struct threadStruct類型的
??????? *threadArr = (struct threadStruct *)malloc(sizeof(struct threadStruct) * TNUM);
??? }
}
?
/************************************************************************/
/* 初始化線程內(nèi)容,第二個(gè)參數(shù)表示的是數(shù)組??????????????????????????????*/
/************************************************************************/
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++)
??? {
??????? //指向數(shù)組地址(注意這里的int *)
??????? px->start = arr + i * LENGTH;
??????? if (N - i * LENGTH >= LENGTH)
??????? {
??????????? //定義每個(gè)所尋數(shù)組的大小
??????????? px->length = LENGTH;
??????? }
??????? else
??????? {
??????? ???//定義每個(gè)所尋數(shù)組的大小
??????????? px->length = N - i * LENGTH;
??????? }
?
??????? //定義線程要查找的內(nèi)容
??????? px->num = targetNum;
??????? //每個(gè)線程的標(biāo)識(shí)id
??????? px->identify = i;
??????? //是否找的標(biāo)識(shí)的地址
??????? px->pflag = &flag;
??????? //存放元素所在位置的地址
??????? px->addr = &numAddress;
???????
??????? //通過下面這句查看進(jìn)程編號(hào)
??????? //printf("\n%d\n",px->identify);
??????? //Sleep(100);
??????? //_beginthread(find,0, &px);
??????? i++;
??? }
?
}
?
/************************************************************************/
/* 打印每個(gè)結(jié)構(gòu)體的內(nèi)容???????????????????????????????????????????????????????????????????*/
/************************************************************************/
void printStructItemContent(struct threadStruct *threadArr, int n)
{
??? //注意,定義變量一定要指向要給NULL,不然會(huì)報(bào)錯(cuò)
??? struct threadStruct *px = threadArr;
??? for (px; px < threadArr + n; px++)
??? {
??????? printf("\n\n指向第一個(gè)位置的值是:%d\n", *px->start);
??????? printf("結(jié)構(gòu)體id=%d,指向的數(shù)組地址start = %p,搜尋范圍length = %d\n",px->identify,px->start,px->length);
??????? printf("查找目標(biāo)值num=%d,標(biāo)識(shí)的地址&flag = %p,存放元素所在位置的地址addr = %p\n\n", px->num, px->pflag, px->addr);
??? }
?
??? //第二種方式打印
??? //for (i = 0; i < n;i++)
??? //{
??? //? printf("\n指向的數(shù)組地址:%p,", threadArr[i].start);
??? //}
}
?
/************************************************************************/
/* 釋放線程數(shù)組的內(nèi)存空間??????????????????????????????????????????????*/
/************************************************************************/
void freeThreadStoreSpace(struct threadStruct *threadArr)
{
??? free(threadArr);
}
?
/************************************************************************/
/* 使用開辟的線程進(jìn)行查找??????????????????????????????????????????????*/
/************************************************************************/
void searchNumByMutiThread(struct threadStruct *threadArr, int n)
{
??? //這里的n表示開辟n個(gè)線程
??? int i;
??? for (i = 0; i < n;i++)
??? {
??????? _beginthread(find,0,&threadArr[i]);
??? }
}
?
main.c
#include <stdio.h>
#include <stdlib.h>
#include <crtdbg.h>??????? //做內(nèi)存泄露檢測(cè)所需的頭文件
#include "array.h"
#include "thread.h"
#include "windows.h"
?
#define _CRTDBG_MAP_ALLOC //開啟內(nèi)存檢測(cè)
#define N 1000000???????? //定義數(shù)組的大小
#define TNUM 100????????? //定義TNUM的線程
#define LENGTH 10000????? //定義每個(gè)線程能夠查找的數(shù)組的長(zhǎng)度(注意:N <= TNUM * LENGTH)
#define TARGETNUM 1000??? //要查找的目標(biāo)數(shù)值
?
int main(int argc, char *argv[])
{
??? //要注意的定義一個(gè)指針,一般的是要給它指向NULL,避免野指針
??? int *arr = NULL;
??? //堆上開辟數(shù)組空間,注意,如果要修改一段內(nèi)存的值,要把指針的地址傳遞進(jìn)去。
??? initArrayStoreSpace(&arr, N);
??? //初始化數(shù)組內(nèi)容
??? initArrayContent(arr, N);
?
??? //定義線程
??? struct threadStruct * threadArr;
??? //為線程開辟空間
??? initThreadArrayStoreSpace(&threadArr, TNUM);
??? //初始化線程內(nèi)容
??? initThreadContent(threadArr, LENGTH, arr,N, TARGETNUM, TNUM);
?
??? //打印數(shù)組內(nèi)容
??? //printArrayContent(arr, N);
??? printStructItemContent(threadArr, TNUM);
?
??? //獲取當(dāng)前時(shí)間
??? //傳遞數(shù)組的時(shí)候傳遞數(shù)組的名稱就可以了。
??? searchNumByMutiThread(threadArr,TNUM);
?
??? //注意,如果沒有考慮線程同步和死鎖問題,這里要設(shè)置休眠時(shí)間,
??? //否則會(huì)將數(shù)組的內(nèi)容釋放。導(dǎo)致錯(cuò)誤出現(xiàn)。
??? Sleep(100000);
???
??? //釋放線程數(shù)組的內(nèi)存空間
??? freeThreadStoreSpace(threadArr);
??? //釋放數(shù)組所占的內(nèi)存空間
??? freeArrayStoreSpace(arr);
?
??? //printf("\n\n%d,%p\n\n", *numAddress,numAddress);//打印地址,還有數(shù)據(jù)
?
??? //加上這一句之后在啟動(dòng)調(diào)試后的輸出窗口中看是否有內(nèi)存泄露
??? _CrtDumpMemoryLeaks();??
??? system("pause");
??? return 0;
}
總結(jié)
以上是生活随笔為你收集整理的动态开辟指定数量的线程来查找动态开辟的数组中的1000000数据中的值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 105级鬼泣史诗套装选择(鬼泣远古传说套
- 下一篇: read的过去式和过去分词(wear的过