在前面的帖子
里聊完了进程终止对C++对象析构的影响。今天咱们来说一下线程对于C++对象析构的影响。
由于C++ 03标准没有包含线程的概念,而C++
0x尚未正式发布。所以对线程的讨论只好根据特定的操作系统平台来谈。对于操作系统自带的线程API,目前比较流行的款式是Windows平台提供的线程API和POSIX平台上的pthread API。但是这两种线程API的差异实在是太大,没法拿出来一起聊。我只好把“线程篇”的帖子再拆分一下,今天先来聊一聊Win32的线程API。<!-- program-think-->
另外,对于进行跨平台开发的同学,应该已经用上了某些跨平台的第三方线程库(比如ACE、Boost等),对于这些库的介绍,初步打算放到“C++的可移植性和跨平台开发
”系列中。
★两套API
:OS API
vs CRT API
本来照例要先介绍线程的几种死法,但是考虑到很多Windows程序员经常混淆线程API,搞不清楚到底该用哪个。所以先来说一下两套线程API的问题。
首先,Windows操作系统本身提供了线程的创建函数CreateThread
和销毁函数ExitThread
。其中的CreateThread
用于创建线程,ExitThread
用于在线程函数内部推出线程(也就是自杀)。
其次,在Visual C++自带的C运行库(以下简称CRT)中,还带了另外4个API函数,分别是:_beginthread
,_endthread
,_beginthreadex
,_endthreadex
。其中的_beginthread
和_beginthreadex
用于创建线程(它们内部调用了CreateThread
),_endthread
和_endthreadex
用于自杀(它们内部调用了ExitThread
)。
有同学看到这里,被搞懵了,心想:“干嘛要搞这么多玩意儿出来糊弄人?有CreateThread
和ExitThread
不就够了嘛!”其实你有所不知,此中大有奥妙啊。
因为OS API作为操作系统本身提供的API函数,它被设计为语言无关的。它们不光可以被C++调用,还可以被其它诸如VB、Python、Delphi等开发语言来调用。所以它们不会(也不能够)帮你处理一些和具体编程语言相关的琐事。
而CRT API虽然最终还是要调用OS API来完成核心的功能,但是CRT API在不知不觉中多帮我们干了一些虽琐碎但重要的工作。(如果同学们想窥探一下CRT API内部都干了些啥,可以拜读一下Win32编程的经典名著《Windows 核心编程》的6.7
章节,里面介绍得挺细致的)
费了这么多口水,无非是要同学们牢记:以后在Windows平台下开发多线程程序,千万不要
直接使用这两个线程API(也就是CreateThread
和ExitThread
),否则后果自负 :-)
另外,顺便补充一下。除了上述提到的CRT库。其它一些Windows平台的C++库也可能提供了线程的启动函数(比如MFC的AfxBeginThread),这些函数也对OS API进行了包装,所以用起来也是安全的。
★三种死法
说完了两套API,开始来讨论一下线程的几种死法。线程和进程一样,也有三种死法。详见如下:
1、自然死亡
一般来说,每个线程都会对应某个函数(以下称为“线程函数”)。线程函数是线程运行的主体。所谓的“自然死亡”,就是通过return
语句结束线程函数的执行。
2、自杀
所谓的“自杀”,就是当前线程通过调用某API把自己
给停掉。前面已经说了OS API的坏话,同学们应该明白不能
再用它们。那我们能否使用CRT API来进行自杀呢?请看MSDN上的相关文档
。上面说了,如果使用_endthread
和_endthreadex
,将导致析构函数不被
调用。
3、它杀
所谓的“它杀”,很明显,就是其它线程通过调用某API把当前线程给强行
停掉。对于Windows平台来说,实现“它杀”比较简单,使用TernimateThread
就直接干掉了(它杀也是最野蛮的)。
★类对象的析构
照前一个帖子
的
风格,还是把类对象分为三种:局部非静态对象、局部静态对象、非局部对象。由于非局部对象是在main之前就创建、在进程死亡时析构,暂时与线程扯不上太大关系。剩下的两种局部对象,在宿主线程(所谓宿主线程,就是创建该局部对象的线程)死亡时会受到什么影响捏?请看如下的对照表:
-------------------------
局部非静态对象 局部静态对象
自然死亡 能 能
自杀 不能 能
它杀 不能 能
-------------------------
从上述结果可以看出,Windows上线程的死法还是以自然死亡为最安全,这点和进程的死法类似。所以同学们在Windows上开发时,要尽量避免自杀和它杀。
★关于主线程之死
所谓“主线程”,就是进程启动时,操作系统为该进程默认创建的第一个线程。通俗地讲,可以把main
函数看成是主线程的线程函数。
主线程之死是有讲究的。由于前面已经阐述了非自然死亡的坏处,所以我们只讨论主线程自然死亡这一种情况。当主线程自然死亡时(也就是用return
从main
返回时),会导致exit
函数被调用,exit
函数就会开始清除当前进程的各种资源,为进程的死亡作准备。这时候,如果还有其它活着的线程,也会被一起干掉(其效果类似于它杀)。
为了防止出现上述情况,主线程一定要负责最终的善后工作。务必等到其它线程都死了,它才能死。
Windows平台上,有关线程的对象析构问题,就聊到这。下一个帖子
,咱们来聊一下pthread相关的对象析构话题。
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想
和本文原始地址:
http://program-think.blogspot.com/2009/03/cxx-object-destroy-with-thread-win32.html
分享到:
相关推荐
在C++中,管理线程是一项复杂但至关重要的任务,特别是在多线程编程和并发环境中。线程的创建与管理不仅影响程序的性能,还直接关系到系统的稳定性和响应性。本文将深入探讨如何在C++中创建以及安全地终止线程,特别...
在C++中,正确地使用和管理线程是多线程编程中的一个关键话题。线程的创建和释放关系到资源的管理以及程序的稳定性和效率。本文将详细讨论如何在C++中正确使用线程以及如何释放线程资源,并重点阐述joinable状态和...
标题中的“开源的win32平台c++多线程开发包”指的是一个专门为Windows操作系统(win32 API)设计的C++编程库,它允许开发者使用C++语言进行多线程程序的开发。这个开发包的核心特性就是其开源性,意味着源代码对公众...
在Windows操作系统中,Win32 API提供了创建和管理多线程的接口,这是实现多线程程序设计的关键技术。 在编写多线程程序时,了解线程的创建、同步、通信和销毁等基础知识是非常重要的。线程的创建涉及调用Win32 API...
《Win32多线程程序设计》一书深入探讨了在Windows操作系统环境下,利用C++进行多线程编程的技术和方法。多线程是现代软件开发中的关键概念,尤其是在资源密集型应用、实时系统和高性能计算领域。通过合理地利用多...
在Win32 API中,这个入口点函数通常被声明为LPTHREAD_START_ROUTINE类型,而在C++11中,它是一个可调用对象。 九宫格是一种常见的用户界面布局,通常用于展示多个子窗口或控件。在多线程环境中,如果九宫格内的控件...
3. 熟悉Win32 API:学习如何利用Windows API进行多线程编程,包括线程的创建、管理和同步,以及线程间通信的实现方法。 4. 应用多线程技术:学习如何设计和实现多线程应用程序,以优化性能,提高系统的并发性和可...
《Win32多线程程序设计》是一本深入探讨C++在Win32平台上实现多线程编程的专业书籍。该书全面覆盖了多线程技术的基础理论与实践应用,为开发者提供了详尽的指导。书中的"加全书签"功能使得读者能够更方便地定位和...
在Windows操作系统中,Win32 API是开发本地应用程序的主要接口,而C++作为强大的编程语言,能够提供面向对象的编程能力,两者结合可以创建高效且功能丰富的桌面应用。 1. **Win32 API基础**:Win32 API是一系列函数...
综上所述,Win32程序的C++编程涵盖了C++基础、Win32 API、STL应用、资源管理、多线程和进程、调试与异常处理等多个方面。掌握这些知识,你就能编写出高效、稳定的Windows应用程序。通过实践和不断学习,你将能更深入...
《用Visual C++设计Win32应用程序》是一个深入探讨如何使用Microsoft Visual C++开发Windows桌面应用程序的教程。这个教程可能是由网上某个知名资源站点提供的原版资料,旨在帮助程序员理解和掌握Win32 API编程。 ...
《win32多线程程序设计源码_侯捷》是一个关于Windows平台上使用C++进行多线程编程的资源集合,由知名IT专家侯捷编著。这个资源可能包括了一系列的示例代码、讲解文档,旨在帮助开发者深入理解和实践win32 API中的多...
《Win32多线程程序设计》是由侯捷翻译的一本经典教材,它深入浅出地介绍了在Windows操作系统环境下如何使用C++进行多线程编程。这本书的源码提供了丰富的实例,是学习和理解C++多线程技术的宝贵资源。 在C++编程中...
这款软件包`mysql-connector-c++-noinstall-1.1.4-win32.zip`包含了MySQL Connector/C++ 1.1.4版本,专为Windows 32位系统设计。 MySQL Connector/C++的主要功能包括: 1. **连接管理**:提供连接到MySQL服务器的...
本文将深入探讨“Win32多线程程序设计”这一主题,结合“VC(Visual C++)”作为开发环境,以及“附书光盘”中的示例代码("SAMPLES"),来阐述多线程编程的关键概念和实践技巧。 1. **多线程的概念** - 多线程是...
压缩包中的OS2、WIN32、UNIX和LISTINGS文件夹可能分别包含对应操作系统平台的示例代码,例如,可能包含Windows API的线程管理示例、Unix/Linux系统调用的多线程实现以及通用的C++代码清单。通过这些示例,读者可以...
本书全面覆盖了C++中用于多线程编程的相关概念、API以及最佳实践,尤其侧重于在Win32环境下进行线程管理。 在C++中,多线程的实现主要依赖于C++11及后续标准引入的 `<thread>` 库。这个库提供了创建、同步和管理...
本压缩包包含了几个关键的学习资源,旨在帮助开发者深入理解和应用C++,尤其是虚函数表的原理以及Win32 API中的多线程编程。 首先,C++习题集是学习任何编程语言的基础。通过实践和解决问题,可以巩固理论知识,...
Win32多线程程序设计是计算机编程领域中一个重要的主题,特别是在开发高效能的应用程序时,多线程技术能够充分利用多核处理器的计算能力,提高程序的响应速度和并发性能。侯捷是一位知名的计算机技术专家,他在该...
本实例“win32多线程实例”旨在帮助初级程序员理解和掌握如何在C++环境中使用win32 API进行多线程编程。 一、win32 API与多线程 win32 API是微软为Windows操作系统提供的编程接口,它允许开发者直接操作系统的底层...