当前位置: 代码迷 >> VC >> 一个简单的vc多线程有关问题
  详细解决方案

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

热度:380   发布时间:2013-02-25 00:00:00.0
一个简单的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;
}
  相关解决方案