终止进程的运行
1主线程的进入点函数返回(最好使用这个方法)。
2进程中的一个线程调用E x i t P r o c e s s函数(应该避免使用这种方法)。
注:这种显示的调用,会导致资源无法释放。举例说明如果在对象析构之前就调用E x i t P r o c e s s,那么对象就无法正常的释放所占用的资源,从而导致内存泄露。
3另一个进程中的线程调用Te r m i n a t e P r o c e s s函数(应该避免使用这种方法)。
注:Te r m i n a t e P r o c e s s函数是个异步运行的函数,也就是说,它会告诉系统,你想要进程终止运行,但是当函数返回时,你无法保证该进程已经终止运行。因此,如果想要确切地了解进程是否已经终止运行,必须调用Wa i t F o r S i n g l e O b j e c t函数或者类似的函数,并传递进程的句柄。
4进程中的所有线程自行终止运行(这种情况几乎从未发生)。
终止线程的运行
若要终止线程的运行,可以使用下面的方法:
1 线程函数返回(最好使用这种方法)。
2通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。
注:该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C + +资源(如C + +类对象)将不被撤消。
3 同一个进程或另一个进程中的线程调用Te r m i n a t e T h r e a d函数(应该避免使用这种方法)。
注:Te r m i n a t e T h r e a d能够撤消任何线程。但是它是一个异步函数,不能保证线程能够及时的撤销
• 包含线程的进程终止运行(应该避免使用这种方法)。
转换到另一个线程
BOOL SwitchToThread();
如果没有线程迫切需要C P U时间,S w i t c h To T h r e a d就会立即返回。如果存在一个迫切需要C P U时间的线程,S w i t c h To T h r e a d就对该线程进行调度
注:这个函数的功能不受线程的优先级影响,这是它与sleep的区别
其他注意事项
1还需要注意的是,要区分window API和C/C++函数,C r e a t e T h r e a d与_ b e g i n t h r e a d e x,E x i t T h r e a d与_ e n d t h r e a d e x等等。
2线程可以自行暂停运行,但是不能自行恢复运行,线程是不可以自己调用 DWORD ResumeThread(HANDLE hThread)来恢复自己运行的。
3在实际环境中,调用S u s p e n d T h r e a d时必须小心,因为不知道暂停线程运行时它在进行什么操作。如果线程试图从堆栈中分配内存,那么该线程将在该堆栈上设置一个锁。
4进程是根本不能调度的,只有线程才能被调度。
5对于Windows 2000来说,系统可以为前台进程的线程提供比通常多的C P U时间量。这种调整只能在前台进程属于正常优先级类的进程时才能进行。如果它属于其他任何优先级类,就无法进行任何调整。
注:所以有时候我们不用刻意的去改变前台程序的进程优先类,那样有时候效果反而适得其反
谢谢你的阅读!!