日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/9/27 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态开辟指定数量的线程来查找动态开辟的数组中的1000000数据中的值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


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 = &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;??? //限定長(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美性猛交99久久久久99按摩 | 天天激情站| 亚洲爱爱片 | 欧美性猛交ⅹxxx乱大交3 | 亚洲欧洲精品一区 | 色姐| 波多野结衣一本一道 | av影视网| 色婷婷社区 | 欧美日韩午夜激情 | 一区二区毛片 | 99这里有精品 | 性免费网站 | 中日韩精品视频在线观看 | 成人资源站 | 伊人精品 | 欧美激情影音先锋 | 国内成人精品 | 女人被男人躁得好爽免费视频 | 亚洲精品在线视频观看 | 小向美奈子在线观看 | 亚洲欧美高清视频 | 午夜精品视频一区二区三区在线看 | 国产又粗又猛又黄又爽视频 | 黄色录像毛片 | 欧美一级艳片视频免费观看 | 日韩国产成人无码av毛片 | 国产乱淫av一区二区三区 | 波多野结衣午夜 | 一道本在线播放 | 欧美性猛交xxxx乱大交 | 亚洲大胆 | 在线观看网站黄 | 久久久久久久久久艹 | 日本簧片在线观看 | 欧美成人午夜 | 涩涩屋视频在线观看 | 日韩视频网址 | 婷婷成人综合 | 秋霞午夜| 久久国产色 | 国产午夜精品一区 | 综合免费视频 | 国产精品一二三级 | 成人在线一区二区 | 依人在线| 欧美春色 | 亚洲免费视频一区二区三区 | 2024国产精品视频 | 第一次破处视频 | 亚洲视频色图 | 精品人妻一区二区三区四区五区 | 噼里啪啦免费观看 | 国产情侣激情 | 欧洲色综合 | 69视频一区二区 | 国产一卡二卡在线 | 免费成人激情视频 | 日本在线h| 玖色视频| 国产一区网站 | 青青草国产一区二区三区 | 国产午夜电影在线观看 | 青草视频免费在线观看 | 日韩五月天 | 久久影院一区 | 黄色三级在线播放 | 清冷男神被c的合不拢腿男男 | www.国产色 | 成人精品一区二区三区中文字幕 | 一本色道久久综合亚洲二区三区 | 中文字幕第 | 91香蕉视频污污 | 少妇厨房愉情理伦bd在线观看 | 美女被出白浆 | 奇米影视第四色7777 | 91免费国产在线 | 欧美xx在线| 欧洲色网站 | 亚洲av无码乱码国产精品久久 | 国产精品999| 夜夜夜久久久 | 欧美成人动态图 | 激情五月色播五月 | 射美女 | 在线日本视频 | 中文字幕一区二 | 成人免费观看cn | 97久久人国产精品婷婷 | 干b视频在线观看 | 亚洲深夜视频 | 六月婷婷激情 | 热播之家 | 国产丝袜美腿一区二区三区 | 波多野吉衣av | 懂色av一区二区三区四区五区 | 日韩99 | 日韩大片免费观看视频播放 | 中文字幕不卡视频 |