主线程退出问题

    主线程如果正常退出(即执行return返回),那么整个进程中所有的其他线程都会被清理;
    如果主线程内执行ExitThread函数进行退出,那么主线程会执行退出,但是其他的线程不会被清理,而会一直执行到正常退出为止。 
#include <iostream>
#include <process.h>
#include <Windows.h>
using namespace  std;
UINT WINAPI ThreadProc(LPVOID pParam)
{
    int p = (int)pParam ;
    int i = 20 ;
    while(--i)
        cout<<p<<"TRUE"<<i<<endl;
    cout<<"ThreadProc exit "<<endl;
    return 0 ;
}
void ThreadCreate()
{
    unsigned int  dwThreadID ;
    HANDLE hThread =(HANDLE) _beginthreadex(NULL,0,ThreadProc,(PVOID)0,0,&dwThreadID) ;
    if(hThread)
    {
        cout<<"Thread is created !"<<endl;
        CloseHandle(hThread) ;
    }
    HANDLE hThread1 =(HANDLE) _beginthreadex(NULL,0,ThreadProc,(PVOID)1,0,&dwThreadID);
    if(hThread1)
    {
        cout<<"Thread1 is created"<<endl;
        CloseHandle(hThread1) ;
    }
}
int main()
{
    ThreadCreate() ;
    cout<<"main1111 exit"<<endl;
    ExitThread(0) ; //主函数调用ExitThread退出,但是子线程并不会随之退出
    cout<<"main2222 exit"<<endl;
    return 0 ;//主线程退出,子线程也随之退出
}

结果1:主线程执行ExitThread函数进行退出,当主线程执行ExitThread 退出之后,主线程剩余的部分将不会执行,但是其他的线程都会运行,直到结束。

Thread is created !

0TRUE19

0TRUE18

0TRUE17

0TRUE16

0TRUE15

0TRUE14

0TRUE13

0TRUE12

0TRUE11

0TRUE10

0TRUE9

0TRUE8

0TRUE7

0TRUE6

0TRUE5

0TRUE4

0TRUET hread1 is created

3

0TRUE2

0TRUE1

ThreadProc exit

main1111 exit //主程序退出,整个结果中没有输出“main2222 exit”

1TRUE19

1TRUE18

1TRUE17

1TRUE16

1TRUE15

1TRUE14

1TRUE13

1TRUE12

1TRUE11

1TRUE10

1TRUE9

1TRUE8

1TRUE7

1TRUE6

1TRUE5

1TRUE4

1TRUE3

1TRUE2

1TRUE1

ThreadProc exit

请按任意键继续…

结果2:主线程执行 return 0 进行退出,其他线程都会直接终止运行。

Thread is created !

0TRUE19

0TRUE18

0TRUE17

0TRUE16

0TRUE15

0TRUE14

0TRUE13

0TRUE12

0TRUE11

0TRUE10

0TRUE9

0TRUE8

0TRUE7

0TRUE6

0TRUE5

Thread1 is created

0TRUE4

0TRUE3

0TRUE2

0TRUE1

ThreadProc exit

main1111 exit

1TRUE19

1TRUEmain2222 exit //主线程退出,线程Thread1并没有执行完成。

请按任意键继续…

时间: 2024-08-02 06:50:00

主线程退出问题的相关文章

c/c++中主线程退出,子线程也会退出

1 #include <windows.h> 2 #include <process.h> /* _beginthread, _endthread */ 3 #include <iostream> 4 5 using namespace std; 6 7 void show(void *ptr); 8 9 int main(){ 10 _beginthread(show, 0, NULL); //创建一个子线程 11 Sleep(10000); 12 return 0;

主线程结束,进程是否退出?

#include <windows.h> #include <process.h> unsigned __stdcall _threadfun(void* pParam) { while(TRUE) { printf("hello world"); } } int main(int argc, char* argv[]) { unsigned uThreaID; _beginthreadex(NULL,0,_threadfun,NULL,NULL,&uT

主线程任务太多导致异常退出(The application may be doing too much work on its main thread)

今天花费了一天的时间来解决这个bug. 这种在程序运行期间出现的问题比较棘手,如果再没有规律的话就更难解决. 还好这个bug是由规律的,也就是说在程序执行半个小时左右后就会因为此异常而导致程序退出:那么在网上找了下原因,无非是说一下几点: 1.把业务放在子线程中去完成,然后通过handler来更新界面 2.通过runOnUiThread的方法来实现 再补充一点就是:优化代码,将不需要重复执行的代码执行一次就ok了,特别是需要绘制UI的代码更不能随便放在重复执行的地方 一.bug现场还原 我的程序

如何让 Qt 的程序使用 Sleep(主线程没有Sleep函数,但线程可用自带的保护函数Sleep)

熟悉的陌生人 Qt 是事件驱动的,所以当你用Qt的时候,几乎时时刻刻和 QEventLoop 打交道.,只是你可能没有意识到: QCoreApplicaton::exec() QApplication::exec() QDialog::exec() QThread::exec() QDrag::exec() QMenu::exec() ... 在前面列出的这些常见函数的背后,都有各自的QEventLoop,可能是我们很少有机会想到自己显式使用QEventLoop的缘故吧,对这个类似乎总是有些陌生

Java线程池主线程等待子线程执行完成

今天讨论一个入门级的话题, 不然没东西更新对不起空间和域名~~ 工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线程的流程,  往往需要让主线程指定后, 等待子线程的完成. 这里有几种方式. 站在 主线程的角度, 我们可以分为主动式和被动式. 主动式指主线主动去检测某个标志位, 判断子线程是否已经完成. 被动式指主线程被动的等待子线程的结束, 很明

Java多线程--让主线程等待所有子线程执行完毕 join

首先从公司一道笔试题开始 1 package test; 2 3 public class Test implements Runnable { 4 5 public int i = 0; 6 7 @Override 8 public void run() { 9 try { 10 Thread.sleep(1000); 11 } catch (InterruptedException e) { 12 // TODO Auto-generated catch block 13 e.printSt

[Android] 任意时刻从子线程切换到主线程的实现原理及加强版

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/article/details/41900879 ========================================================

android handle详解2 主线程给子线程发送消息

按照android handler详解分析的原理我们可以知道,在主线程中创建handle对象的时候,主线程默认创建了一个loop对象使用threalocal函数将loop对象和主线程绑定. 我们能不能在子线程中创建一个loop对象和子线程绑定了实际上是可以的 这样我们就在子线程中创建了一个looper对象,将looper对象和子线程绑定了,在子线程中执行Loop.loop()函数的内部是开启了一个死循环对消息队列中的消息进行遍历,所以子线程是永远不会退出的. 当我们在主线程中调用获得subHan

主线程和子线程的同步控制

一个线程的结束有两种途径,一种是象我们以下的样例一样.函数结束了.调用它的线程也就结束了.还有一种方式是通过函数pthread_exit来实现.另外须要说明的是,一个线程不能被多个线程等待,也就是说对一个线程仅仅能调用一次pthread_join.否则仅仅有一个能正确返回.其它的将返回ESRCH 错误. 在Linux中,默认情况下是在一个线程被创建后.必须使用此函数对创建的线程进行资源回收,可是能够设置Threads attributes来设置当一个线程结束时.直接回收此线程所占用的系统资源.具