Windows多线程编程困惑

来源:互联网 发布:好的外文数据库 编辑:程序博客网 时间:2024/06/06 07:15

1、采用_beginthreadex()创建的线程结束后是否一定要采用CloseHandle(hThead)函数手动关闭线程句柄?

     线程1(对应系统内核对象1)创建线程2后,线程2返回了线程句柄(系统内核对象2),线程1调用CloseHandle函数后,系统会自动删除线程2的内核对象,这是系统正常的处理流程;如果不显示的调用CloseHandle,则线程2结束运行后,系统不会删除线程2对应的内核对象2,会造成内存泄露,不过当整个进程结束时操作系统会自动关闭该进程的所有的内核对象包括线程2的内核对象,所以不显示调用CloseHandle问题不大,只是在你的进程运行的时候会造成内存泄露,进程结束后系统是会自动清理的。

有关“使用CloseHandle关闭线程句柄,终止线程运行的方法”的更多内容可参考博文:http://blog.csdn.net/hanyujianke/article/details/8523386


2、在基于MFC的多线程界面编程中,不应该直接在窗口的消息处理函数中创建多个线程,如果需要创建多个线程,可直接在窗口的消息处理函数中先创建线程1(ThreadFunc1),再用该线程1来创建众多线程,这是为什么呢?

     如果界面线程在窗口的消息处理函数中一直在创建多个线程,那么界面线程将不能及时处理消息,所以不应该直接在窗口的消息处理函数中创建多个线程,可直接在窗口的消息处理函数中先创建线程1(ThreadFunc1),再用该线程1来创建众多线程。


3、线程句柄和线程ID的概念?

     线程句柄是一个内核对象,可以通过线程句柄来操作线程,但是线程的生命周期和线程句柄的生命周期是不一样的。此外,线程句柄(即内核对象)用了是要还的,也就是说用完之后一定要CloseHandle函数关闭之,如果不这么做,系统的句柄资源很快就用完了。


3.1、线程句柄的生命周期?

     线程句柄的生命周期是从创建线程的函数(如CreateThread、__beginthread、__beginthreadex)返回到CloseHandle函数执行完成。


3.2、内核对象的概念?

     内核对象由内核所拥有,而不是由进程所拥有。


4、如何控制线程?

     线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完成任务后在执行。


5、线程1创建线程2时,线程1如何向线程2传递多个参数?

     线程1可以通过一个结构体向线程2传递多个参数。


6、线程之间如何通信?

     线程1可以通过Win32提供的API函数向指定的线程发送消息。


7、线程的概念?

     线程是指进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。


8、如何创建一个线程?

     可以通过调用Win32提供的API函数CreateThread来创建一个线程,也可以通过调用CRT提供的多线程函数(__beginthread或__beginthreadex)来创建一个线程。

有关“采用__beginthread/__beginthreadex函数创建多线程”的更多内容可参考博文:http://blog.csdn.net/cbnotes/article/details/8331632


8.1、如何结束一个线程的执行?

     API函数CreateThread创建的线程,采用如下方法结束:

     (1)线程函数返回(最好使用该方法);

     (2)通过调用ExitThread函数,正常结束一个线程的执行,线程将自行撤销(最好不使用该方法);

     (3)同一个进程或另一个进程中的线程调用TerminateThread函数,强致终止一个线程的执行(应该避免使用该方法);

     (4)通过调用ExitProcess和TerminateProcess函数来终止线程的执行(应该避免使用该方法);

      CRT提供的多线程函数__beginthread创建的线程,采用如下方法结束:

     (1)线程函数返回(最好使用该方法);

     (2)通过调用__endthread函数来结束线程的执行;

      CRT提供的多线程函数__beginthreadex创建的线程,采用如下方法结束:

     (1)线程函数返回(最好使用该方法);

     (2)通过调用__endthreadex函数来结束线程的执行;


8.2、为什么创建线程后,可以立刻把线程的句柄关闭?这样做的目的是什么?这样做会杀掉线程吗?

     因为线程和线程句柄(Handle)不是同一个东西,线程只是进程的一条执行路径,而线程句柄是一个内核对象。可以通过线程句柄来操作线程,但是线程的生命周期和线程句柄的生命周期是不一样的。线程的生命周期就是线程函数从开始执行到return,而线程句柄的生命周期是从创建线程的函数(如CreateThread、__beginthread、__beginthreadex)返回到CloseHandle函数执行完成。所有的内核对象(包括线程Handle)都是系统资源,线程句柄(即内核对象)用了是要还的,也就是说用完之后一定要CloseHandle函数关闭之,如果不这么做,系统的句柄资源很快就用完了。所以,创建线程后,可以立刻把线程的句柄关闭(前提是你不再需要用这个线程句柄),这样线程结束后,系统立刻删除该线程对应的内核对象(等效于该线程占用的系统资源立刻被释放)。


9、用户界面线程与工作线程的概念?

     MFC对多线程进行了一层简单的封装,在Visual C++中每个线程都是从CWinThread类继承而来的。每一个应用程序的执行都有一个主线程,这个主线程也是从CWinThread类继承而来的。可以利用CWinThread对象创建应用程序执行的其它线程。MFC用CWinThread对象来表示所有线程。利用MFC可以创建两种线程,分别称为工作线程和用户界面线程。二者的主要区别在于工作线程没有消息循环,而用户界面线程有自己的消息队列和消息循环;工作线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等,而用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。

有关“MFC多线程的创建,包括工作线程和用户界面线程”的更多内容可参考博文:

http://blog.csdn.net/cbnotes/article/details/8465212


10、主线程与子线程的概念?

       进程的主线程在任何需要的时候都可以创建新的线程,被新创建的线程称为子线程。


11、进程与线程的关系?

       在Windows的一个进程内,包含一个或多个线程。线程是指进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。一个进程内的所有线程使用同一个32位地址空间,这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完成任务后在执行。在多处理器的机器上,调度程序可将多个线程放到不同的处理器上去运行,这样就使处理器的任务平衡,也提高了系统的运行效率。


12、线程的生命周期?

       线程的生命周期就是线程函数从开始执行到return。


13、进程的生命周期?

       进程的生命周期就是程序从开始执行到结束。









0 0
原创粉丝点击