一个简单的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;
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
关于visual studio 2005的工程文件*.vcproj的问题
请问:Visual Studio 2005 新建一个工程之后,会自动生产一个*.vcproj的一个文件,这...
-
用MFC画图的问题
我现在要用随机数产生300个固定的点保存在数组中,并在ondraw里画出这300个点,而且通过定时器使这300个点做运动。...
-
VS2010中的C++怎么连接数据库?
之前一直用VC++6.0的、现在想学学用最新的VS、但是感觉连接数据库和之前不一样了、具体应该怎么弄...
-
CLI编程 高手帮忙
我现在用C++/CLI 混编,
我有一个方法, 是调用一个C 的类库 得到一个 char * 的值
现在我...
-
新手求教::VC.NET2003里面的"添加变量"菜单变灰了,怎么弄?
最近学着用.net写程序,以前用的是6.0,不知道为什么我设计的EDIT Con...
-
刚学习vc.net 请教一个String做参数的问题,请高手指教一下
下面的代码为什么不能编译呢,出现这个错误呢
.\clr.cpp(12) : error C3...
-
VS2003中通过ADO取SQL2003中bigint 负值变正值的问题,求助!
在SQL2003中 数据库中假设 一个bigint类型的数据位-1234这样的值,通过如...
-
新手学习VC用那个版本的编译器好!
新手学习VC用那个版本的编译器好!?
------解决方案--------------------
VC++6.0
------解决...
-
正则表达式
有这样的字符串
"1,',2"",3"
希望将单个的"替换成单引号,将连续两个的""替换成一个双引号。
正则表达式该如何写。
...
-
为什么<<精通MFC>>附带的源程序不能编译成功
vc2010编译后有两个错误提示,分别如下,
错误一:
1>c:\program files\microsoft vi...