| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1439 人关注过本帖
标题:初学线程,发现一用Sleep()函数就会内存冲突,各位LZ帮我看看是哪里出问题了 ...
只看楼主 加入收藏
啊蒋
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-2-26
结帖率:70%
收藏
已结贴  问题点数:20 回复次数:3 
初学线程,发现一用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;
        }

    }
}


搜索更多相关主题的帖子: include 结构体 动态 信息 
2017-06-05 19:35
啊蒋
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-2-26
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-06-05 19:35
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
子线程还没结果之前,主线程可能就结束了。除非你将 Sleep(100) 设得非常大(其实也是没用的)。

说说你的错误吧,
a. 你应该用 _beginthreadex,看MSDN对_beginthread的描述:If the thread generated by _beginthread exits quickly, the handle returned to the caller of _beginthread might be invalid or, worse, point to another thread。
b. 你应该用 WaitForSingleObject 等待所有子线程执行完毕,而不是Sleep(100)
c. 对 flag 的读写,不用锁,那就得用原子操作函数

C语言有自带的线程函数,在 <threads.h> 和 <stdatomic.h> 中
2017-06-06 08:49
啊蒋
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-2-26
收藏
得分:0 
回复 3楼 rjsp
多谢楼主,
2017-06-06 20:28
快速回复:初学线程,发现一用Sleep()函数就会内存冲突,各位LZ帮我看看是哪里出 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026069 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved