首页
社区
课程
招聘
[旧帖] [求助]关于多线程的疑问 0.00雪花
发表于: 2009-3-18 17:30 3522

[旧帖] [求助]关于多线程的疑问 0.00雪花

2009-3-18 17:30
3522
windows编程经验较少,有个CreateThread的疑问请windows程序员帮忙解答下

DWORD WINAPI mythread( LPVOID lpParam )
{
    Sleep(10000);
    return 0;
}

main()
{

    HANDLE handle1;   
    DWORD dw1;
   
    handle1=CreateThread(NULL,0,gamethread,NULL,0,&dw1);
   
    if(handle1==NULL)   
    {   
        printf("CreateThread Fail");
    }

    WaitForSingleObject( handle1 , INFINITE);
    CloseHandle(handle1);
    //做其他处理
   .
     .
     .

    return ;
}

程序中create了一个线程,假设这个线程的功能就是sleep了10秒。

我希望主线程create完这个线程后继续做其他工作。如上代码的话会hang在WaitForSingleObject,因为要等待线程结束。
把WaitForSingleObject( handle1 , INFINITE);去掉可以达到目的,但是
我不清楚这样做是否正确?是否会造成内存泄漏等等

另外,create出来的线程用return退出可以么?还是要ExitThread?
用return会不会造成内存泄漏?

菜菜, ,请各位帮忙答疑~

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
感觉WaitForSingleObject应该和 pthread里面的 pthread_join() 类似。
2009-3-18 17:39
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
还有个问题

如果主线程先执行到 CloseHandle(handle1);

而create出来那个线程还没处理完成,这样会有问题么。
2009-3-18 17:43
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
测试了一下可以,但不知道这样写是否规范,害怕有内存泄漏
2009-3-18 17:53
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
5
1, 不会造成内存泄漏 当然 你在线程中分配的内存要自己管理好
2,可以直接return,自然结束的话 比如对象都可以自然销毁进而析构,最好不要自己用ExitThread,这样强行终止的话,会造成有的内存没有free掉,进而导致内存泄漏。
3,线程运行时可以CloseHandle,前提是你不需要再对这个线程操作,handle只是一个标识,存储了线程的一些信息,指向内核的内存块。不close的话就会内存泄漏 = =

下面参考 http://program-think.blogspot.com/2009/03/cxx-object-destroy-with-thread-win32.html
  ★类对象的析构
  照前一个帖子的风格,还是把类对象分为三种:局部非静态对象、局部静态对象、非局部对象。由于非局部对象是在main之前就创建、在进程死亡时析构,暂时与线程扯不上太大关系。剩下的两种局部对象,在宿主线程(所谓宿主线程,就是创建该局部对象的线程)死亡时会受到什么影响捏?请看如下的对照表:
-------------------------
       局部非静态对象  局部静态对象
 自然死亡    能        能
  自杀     不能       能
  它杀     不能       能
-------------------------
2009-3-18 18:14
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
谢谢!
看过这篇博文,结论好像是

1.创建线程应该用_beginthread和_beginthreadex,而不是CreateThread
2.线程内部应该用return来自然死亡
3.主线程一定要最后死亡,否则主线程return直接导致其他线程终止

对么
2009-3-19 09:50
0
游客
登录 | 注册 方可回帖
返回
//