求S.H.I.TE热门歌曲mp3下载

6.5 终止线程的运行
若要终止线程的運行可以使用下面的方法:
?  线程函数返回(最好使用这种方法)。
?  通过调用E x i t T h r e a d函数线程将自行撤消(最好不要使用这种方法)。
?  包含线程的进程终止运行(应该避免使用这种方法)
下面将介绍终止线程运行的方法,并且说明线程终止运行时会出现什么情况
始终嘟应该将线程设计成这样的形式,即当想要线程终止运行时它们就能够返回。这是
确保所有线程资源被正确地清除的唯一办法
如果线程能够返回,就可以确保下列事项的实现:
?  在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消
?  操作系统将正确地释放线程堆栈使用的内存。
?  系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值
?  系统将递减线程内核对象的使用计数。
可以让线程调用E x i t T h r e a d函数以便强制线程终止运行:
该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源但是,C + +资源(如C + +类对象)将不被撤消由于这个原因,最好从线程函数返回而不是通过调用E x i t T h r e a d来返回(详细说明参见第4章)。
o f t的Visual C++编译器你的编译器供应商有它自己的E x i t T h r e a d的替代函数。不管这个替代函数是什么都必须使用。本章后面将说明_ e n d t h r e a d e x的作用和它的重要性
第6章线程嘚基础知识计计127
注意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 (第9章介绍)或者类似的函数传递线程的
设 计良好的应用程序从来不使用这个函数,因為被终止运行的线程收不到它被撤消的通知线程不能正确地清除,并且不能防止自己被撤消注意当使用返回或调用E x i t T h r e a d的方法撤消线程时,该线程的内存堆栈也被撤消但是,如果使用Te r m i n a t e T h r e a d那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈M i c r o s o f t故意用这种方法来实現Te r m i n a t e T h r e a d。如果其他仍然正在执行的线程要引用强制撤消的线程堆栈上的值那么其他的线程就会出现访问违规的问题。如果将已经撤消的线程嘚堆栈留在内存中那么其 他线程就可以继续很好地运行。此外当线程终止运行时, D L L通常接收通知如果使用Terminate Thread 强迫线程终止,D L L就不接收通知这能阻止适当的清除(详细信息参见第2 0章)。
4 在进程终止运行时撤消线程
第4章介绍的E x i t P r o c e s s和Te r m i n a t e P r o c e s s函数也可以用来终止线程的运行差别在于這些线程将会使终止运行的进程中的所有线程全部终止运行。另外由于整个进程已经被关闭,进程使用的所有资源肯 定已被清除这当嘫包括所有线程的堆栈。这两个函数会导致进程中的剩余线程被强制撤消就像从每个剩余的线程调用Te r m i n a t e T h r e a d一样。显然这意味着正确的应用程序清除没有发生,即C + +对象撤消函数没有被调用数据没有转至磁盘等等。

我要回帖

更多关于 S H E 的文章

 

随机推荐