6.7.1 Oops—错误地调用了C r e a t e T h r e a d
来源:互联网 发布:java网上商城 编辑:程序博客网 时间:2024/04/27 15:44
6.7.1 Oops—错误地调用了C r e a t e T h r e a d
也许你想知道,如果调用C r e a t e T h r e a d,而不是调用C / C + +运行期库的_ b e g i n t h r e a d e x来创
建新线程,将会发生什么情况。当一个线程调用要求t i d d a t a结构的C / C + +运行期库函数时,将
会发生下面的一些情况(大多数C / C + +运行期库函数都是线程安全函数,不需要该结构)。首
先, C / C + +运行期库函数试图(通过调用T l s G e t Va l u e )获取线程的数据块的地址。如果返回
N U L L作为t i d d a t a块的地址,调用线程就不拥有与该地址相关的t i d d a t a块。这时,C / C + +运行期
库函数就在现场为调用线程分配一个t i d d a t a块,并对它进行初始化。然后该t i d d a t a块(通过
T l s S e t Va l u e)与线程相关联。此时,只要线程在运行,该t i d d a t a将与线程待在一起。这时,
C / C + +运行期库函数就可以使用线程的t i d d a t a块,而且将来被调用的所有C / C + +运行期函数也
能使用t i d d a t a块。
当然,这看来有些奇怪,因为线程运行时几乎没有任何障碍。不过,实际上还是存在一些
问题。首先,如果线程使用C / C + +运行期库的s i g n a l函数,那么整个进程就会终止运行,因为
结构化异常处理帧尚未准备好。第二,如果不是调用_ e n d t h r e a d e x来终止线程的运行,那么数
据块就不会被撤消,内存泄漏就会出现(那么谁还为使用C r e a t e T h r e a d函数创建的线程来调用
_ e n d t h r e a d e x呢?)。
注意如果程序模块链接到多线程D L L版本的C / C + +运行期库,那么当线程终止运行
并释放t i d d a t a块(如果已经分配了t i d d a t a块的话)时,该运行期库会收到一个
D L L T H R E A D D E TA C H通知。尽管这可以防止t i d d a t a块的泄漏,但是强烈建议使用
_ b d g i n t h r e a d e x而不是使用C r e a t e t h r e a d来创建线程。
也许你想知道,如果调用C r e a t e T h r e a d,而不是调用C / C + +运行期库的_ b e g i n t h r e a d e x来创
建新线程,将会发生什么情况。当一个线程调用要求t i d d a t a结构的C / C + +运行期库函数时,将
会发生下面的一些情况(大多数C / C + +运行期库函数都是线程安全函数,不需要该结构)。首
先, C / C + +运行期库函数试图(通过调用T l s G e t Va l u e )获取线程的数据块的地址。如果返回
N U L L作为t i d d a t a块的地址,调用线程就不拥有与该地址相关的t i d d a t a块。这时,C / C + +运行期
库函数就在现场为调用线程分配一个t i d d a t a块,并对它进行初始化。然后该t i d d a t a块(通过
T l s S e t Va l u e)与线程相关联。此时,只要线程在运行,该t i d d a t a将与线程待在一起。这时,
C / C + +运行期库函数就可以使用线程的t i d d a t a块,而且将来被调用的所有C / C + +运行期函数也
能使用t i d d a t a块。
当然,这看来有些奇怪,因为线程运行时几乎没有任何障碍。不过,实际上还是存在一些
问题。首先,如果线程使用C / C + +运行期库的s i g n a l函数,那么整个进程就会终止运行,因为
结构化异常处理帧尚未准备好。第二,如果不是调用_ e n d t h r e a d e x来终止线程的运行,那么数
据块就不会被撤消,内存泄漏就会出现(那么谁还为使用C r e a t e T h r e a d函数创建的线程来调用
_ e n d t h r e a d e x呢?)。
注意如果程序模块链接到多线程D L L版本的C / C + +运行期库,那么当线程终止运行
并释放t i d d a t a块(如果已经分配了t i d d a t a块的话)时,该运行期库会收到一个
D L L T H R E A D D E TA C H通知。尽管这可以防止t i d d a t a块的泄漏,但是强烈建议使用
_ b d g i n t h r e a d e x而不是使用C r e a t e t h r e a d来创建线程。
- 6.7.1 Oops—错误地调用了C r e a t e T h r e a d
- 如果你正在编写 C / C + +代码,决不应该调用C r e a t e T h r e a d
- Te r m i n a t e T h r e a d函数是异步运行的函数,必须调用Wa i t F o r S i n g l e O b j e c t
- _ b e g i n t h r e a d e x函数与C r e a t e T h r e a d函数
- (J2ME)C H A P T E R 1
- N o v e m b e r 1 3 t h T u e s d a y
- 决不应该调用E x i t T h r e a d。应该使用Visual C++运行期库函数_ e n d t h r e a d e x
- C r e a t e P r o c e s s的b I n h e r i t H a n d l e s参数
- N o v e m b e r 7 t h W e d n e s d a y
- N o v e m b e r 8 t h T h u r s d a y
- N o v e m b e r 2 9 t h T h u r s d a y
- N o v e m b e r 1 6 t h F r i d a y
- N o v e m b e r 6 t h T u e s d a y
- N o v e m b e r 2 0 t h T u e s d a y
- N o v e m b e r 2 7 t h T u e s d a y
- F i r s t T h r e a d可以在S e c o n d T h r e a d将5分配给F i r s t T h r e a d的x之前结束它的 操作
- I N T E R V I E W S W I T H T H E V A M P I R E S 1
- H I B E R N A T E 错误集锦
- 延参法师-《80后脱口秀》 -《天天向上》-《宽怀人生》
- N进制数字及“移码”应用
- glut实现动画
- js判断图片是否加载完成
- .net WinForm用户控件开发--(1)带按钮的textbox控件
- 6.7.1 Oops—错误地调用了C r e a t e T h r e a d
- Android中的JSON详细总结
- 有关串口获得控制台的问题
- 7个超棒的HTML5交互性网站
- Archlinux 2012.7.15安装(2014年05月09日更新)
- 使用gprof和oprofile工具分析系统性能
- 抗锯齿方法两种(其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true))
- 彰显程序的美丽与魅力——Ajax系列之四之错误处理
- ArcGIS 10.1 for Server 架构