专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VC

一个简单的vc多线程有关问题

发布时间:2011-06-23 14:23:35 文章来源:www.iduyao.cn 采编人员:星星草
一个简单的vc多线程问题
在main函数调用多线程函数,由于函数要对全局变量进行修改,所以在Engy_cosumption函数中加了CRITICAL_SECTION,防止死锁。在实际中,我遇到一些问题:
1.修改_sleep中休眠的值,有时候程序会崩溃,有什么不会,这是什么原因?我没有显示关闭每个线程句柄,不知可以吗?
2.如何关闭每个开启的线程?



CRITICAL_SECTION g_cs;
int main(){

....
....
 
//调用多线程函数  

while(){
Thread= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Engy_cosumption,(void*)(&thdPara),0,NULL);
}
_sleep(100);
return 0;

}


void Engy_cosumption(void *thdPara){

EnterCriticalSection(&g_cs);
for(int i=0;i<(int)margin_load;++i){
  对全局编码进行操作
}//for
LeaveCriticalSection(&g_cs);

}

------解决方案--------------------
1.修改_sleep中休眠的值,有时候程序会崩溃,有什么不会,这是什么原因?我没有显示关闭每个线程句柄,不知可以吗?
因为windows是抢占式操作系统,分配到每个进程时间不一致,你好好检查下代码,并调试下看看错误原因所在

2.如何关闭每个开启的线程?

thread的exit 方法

------解决方案--------------------
退出线程只要在Engy_cosumption函数里面调用AfxEndThread或者ExitThread即可。后面一个函数我可能记错了,查一下msdn吧
------解决方案--------------------
线程结束后是否调用AfxEndThread以及ExitThread,以我个人经验来看无影响。
线程中资源的释放,只要能做到自己定义的资源,自己能保证释放就可以。

while(){ // 我不知道这里是否有结束条件,还是你只是写个例子。如果没有结束条件,这里肯定会崩溃。
Thread= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Engy_cosumption,(void*)(&thdPara),0,NULL);


_sleep(100); 
// 这个sleep和程序崩溃应该是没有任何关联的,是10还是100都没有问题,问题是sleep结束后,程序就立马退出了。所以我怀疑是你的for循环中存在问题,里面是否有检测主程序准备结束的机制,如errorno = -1等。
return 0;

}

你最好是把正确程序给出来,哪怕是一个大致也行,你这种代码无法给你解决。
下面是给你的一点建议


int main()
{
handle threadhandle[x];
int i = 0;
while
{
threadhandle[i] = createthread
i++
}

// 用这种方法等待所有线程结束后,在结束主程序
WaitForMultipleObjects(i, threadhandle, true, -1); 
return 0;
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: