在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;
}