初学线程,发现一用Sleep()函数就会内存冲突,各位LZ帮我看看是哪里出问题了
//我是写了一个在1000000个int类型的数组用100个线程去查找数据#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<time.h>
#include<process.h>
#define SIZE 1000000 //动态数组的大小
extern int flag; //是否找到的标识符,找到是0,没有是1
typedef struct Large_data //定义一个结构体为线程传递信息
{
int order; //线程的编号
int* pstart; //每个线程开始查找的地址
int length;
int* pflag; //存储标识符的地址,好改变标识符的值
int num; //需要查找的数据
}Large_data;
void Large_find(void* p); //查找数据的函数
void ppfind(int* p,int num) //不开启线程查找的函数
{
for (int i = 0; i < SIZE; i++)
{
if (p[i] == num)
{
printf("找到了%d\n",p[i]);
return;
}
}
}
int main()
{
int* plarge = (int*)calloc(SIZE, sizeof(int)); //动态申请存储1000000个int类的数据
if (!plarge)
{
printf("分配失败");
exit(1);
}
printf("%p\n", plarge);
int i = 1;
for (int* p = plarge; p < plarge + SIZE; p++) //为动态数组赋初值
*p = i++;
Large_data Data[100]; //创建有100个结构体数组为100个线程传递信息
DWORD start = GetTickCount(); // 记录开始线程的时间
for (int i = 0; i < 100; i++) //开启100个线程
{
Data[i].pstart = plarge + 10000*i; //让每一个线程在10000个数据中查找
Data[i].length = 10000; //确定每一个线程查找的长度
Data[i].num = 10000; //为每一个线程传递需要查找的数据
Data[i].order = i;
Data[i].pflag = &flag;
_beginthread(Large_find, 0, &Data[i]);
//Sleep(100);
}
/*clock_t start = 0, end = 0;
double cpu_time = 0.0;
start = clock();*/
//ppfind(plarge, 100000);
Sleep(100);
DWORD end = GetTickCount(); //记录线程结束的时间
//end = clock();
//cpu_time =(double) (end - start) / CLOCKS_PER_SEC;
//printf("%lf", cpu_time);
printf("%ld", end - start); //打印所花的时间
free(plarge);
plarge = NULL;
getchar();
return 0;
}
void Large_find(void* p)
{
Large_data* pdata = (Large_data*)p;
for (int* ptemp = pdata->pstart; ptemp < pdata->pstart + pdata->length; ptemp++) //遍历10000个数据查找所需要找的数据
{
//Sleep(10);发现只要在这里添加休眠10ms函数就会内存冲突
if (flag == 0) //检测其他线程是否找到,找到就退出循环
{
printf("线程%d,没有找到\n", pdata->order);
return;
}
if (*ptemp == pdata->num) //如果找到,就改变标识符,好让其他线程退出查找
{
*(pdata->pflag) = 0;
printf("线程%d的,找到%d了\n", pdata->order, *ptemp);
return;
}
}
}