`

终止运行线程的注意事项

 
阅读更多

终止运行线程

1. 线程函数返回。

2. 线程通过调用ExitThread函数“杀死”自己(避免使用)。

3. 同一个进程或另一个进程中的线程调用TerminateThread函数(避免使用)

4. 包含线程的进程终止运行(避免使用)

 

让线程函数返回,可以确保:

1. 线程函数中创建的所有C++对象都通过其析构函数被正确的销毁;

2. 操作系统正确释放线程栈使用的内存;

3. 操作系统把线程的退出代码设为线程函数的返回值;

4. 系统递减少线程的内核对象的使用计数。

 

使用ExitThread函数终止线程,并导致操作系统清理该线程使用的所有操作系统资源。但是,C++资源不会被回收。

不同于ExitThread总是“杀死”主调线程,TerminateThread能杀死任何线程,但是,线程无法正确清理,而且不能阻止自己被终止运行。详见《windows核心编程》P149。

 

ExitThread举例:

#include <iostream>
#include <windows.h>
#include <process.h>

using namespace std;
unsigned int last_handle;

unsigned int __stdcall lastFunc(PVOID pm) {
	cout << "hello world hello kitty" << endl;
	Sleep(2000);
	_endthreadex(last_handle);
	cout << "hello world" << endl;
	return 0;
}

int main() {
	last_handle = _beginthreadex(NULL, 0, lastFunc, NULL, 0, NULL);
	Sleep(500);
	
	cout << "to be end..." << endl;

	getchar();
	return 0;
}

运行结果为:


 

线程函数 终止自己。

 

#include <iostream>
#include <windows.h>
#include <process.h>

using namespace std;

unsigned int last_handle;

unsigned int __stdcall lastFunc(PVOID pm) {
	cout << "hello world hello kitty" << endl;

	Sleep(2000);
	cout << "hello world" << endl;
	return 0;
}

int main() {
	last_handle = _beginthreadex(NULL, 0, lastFunc, NULL, 0, NULL);
	_endthreadex(last_handle);

	Sleep(500);
	
	cout << "to be end..." << endl;
	getchar();
	return 0;
}

运行结果如下:


 显示出运行窗口之后,窗口自动消失

在主线程中调用了_endthreadex(last_handle);  会保证该 last_handle 线程完成后, 主线程终止。

比较让人奇怪的是 传入的是子线程的句柄,子线程非但不终止 而且 主线程在等待子线程结束后,终止了自己。

 

_endthreadex函数 只能在调用线程中终止自己。

 

 

 

 

 

  • 大小: 10.7 KB
  • 大小: 10.3 KB
分享到:
评论

相关推荐

    终止线程的源代码资源

    8. **注意事项** - **避免长时间阻塞操作**:如长时间I/O操作,应考虑使用异步或非阻塞I/O。 - **资源管理**:确保线程退出前关闭所有资源,如数据库连接、网络套接字等。 总之,终止线程需要谨慎处理,避免对...

    java中 如何终止一个线程

    #### 四、注意事项 1. **中断状态的检查与清除**:在处理中断时,需要定期检查线程的中断状态,并在必要时使用`Thread.interrupted()`方法清除中断状态。这是因为`Thread.interrupted()`会清除当前线程的中断状态,...

    delphi判断线程状态

    6. **注意事项** 当判断线程状态时,需要注意线程竞争条件,确保在进行状态检查时使用适当的同步机制,如互斥量或信号量,以避免数据竞争问题。 综上所述,理解Delphi中线程的状态及其判断方式是多线程编程的关键...

    JAVA多线程的使用场景与注意事项总结

    JAVA多线程的使用场景与注意事项总结 Java多线程是Java语言中的一种重要机制,允许程序同时执行多个任务,以提高程序的执行效率和响应速度。在Java中,多线程可以通过继承Thread类、实现Runnable接口或使用线程池来...

    12.1 Qt5多线程:多线程及简单实例

    注意事项** - GUI操作应始终在主线程中进行,因为Qt的GUI组件不是线程安全的。 - 使用`QThread::quit()`或`QThread::wait()`来优雅地终止线程,避免资源泄漏。 - 避免在线程之间共享复杂的Qt对象,除非使用`QThread...

    线程的功能

    5. **实际应用中的注意事项** - **线程同步**:在多线程环境下,必须处理线程间的通信和同步,以避免数据竞争和死锁。`Mutex`, `Semaphore`, `Monitor`等同步原语可以帮助我们实现这一目标。 - **线程优先级**:...

    delphi 多线程调试demo

    六、注意事项 1. **线程安全**:在多线程环境下,对共享资源的访问需要特别小心,避免数据竞争和死锁。可以使用锁(如TCriticalSection或TMutex)来保护共享数据。 2. **异常处理**:确保在线程的Execute方法中有...

    VS2019 MFC线程的创建

    5. **注意事项** - 确保在线程中正确处理异常,以防止线程意外终止。 - 在多线程环境中,资源的访问必须是线程安全的,避免数据竞争和死锁。 - 适当的同步机制可以防止主线程和工作线程之间的冲突。 - 了解 `afx...

    C#多线程笔记

    - **注意事项**:除非万不得已,否则应尽量避免使用 `Thread.Abort()` 方法来终止线程,因为这可能会导致程序出现异常行为或数据损坏。 #### 四、线程的启动与停止 1. **启动线程**:创建线程时,线程初始状态为...

    JAVA线程停止的方法

    ### 最佳实践与注意事项 虽然使用标志变量是一种优雅的线程停止策略,但在实际应用中还需注意以下几点: 1. **异常处理**:在`run()`方法中的循环体内,应加入适当的异常处理逻辑,确保线程能够妥善响应外部中断...

    linux线程的基本概念

    **多线程编程注意事项** - 线程安全:确保对共享资源的访问是线程安全的,避免数据竞争。 - 死锁预防:避免多个线程相互等待对方释放资源导致的死锁现象。 - 资源管理:正确使用`pthread_join()`和`pthread_detach()...

    VC多线程编程

    #### 五、多线程编程注意事项 1. **线程安全**:确保共享资源访问的同步,避免数据竞争和死锁。 2. **资源管理**:正确处理线程生命周期中的资源分配和释放。 3. **性能考量**:频繁的线程切换可能会导致性能下降,...

    多线程学习文档

    ##### 多线程的注意事项 - **切换成本**:频繁的线程切换会导致较高的切换成本,从而降低系统的整体性能。 - **线程安全**:多线程环境下需要特别注意线程安全问题,避免出现数据竞争和死锁等现象。 #### 三、线程...

    VC中多线程10个详细例程

    五、多线程编程的注意事项 在多线程编程时,需要注意线程切换所消耗的 CPU 资源,避免了某个任务长时间占用 CPU 时间。 六、VC 中多线程编程的实现 VC 中提供了多种方式来实现多线程编程,如使用 Win32 API 函数...

    Java线程培训资料

    - `ThreadPoolExecutor`: 控制运行线程的数量,防止过多线程消耗系统资源。 - 通过构造函数`ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue...

    在独立线程中显示WPF窗口

    通过以上讨论,我们可以理解在独立线程中显示WPF窗口的关键技术和注意事项,包括多线程设计、线程安全、Dispatcher的使用以及异步编程模型。理解和掌握这些知识点能帮助开发者创建高效且响应迅速的WPF应用程序。

    AS/400-多线程编程技术.pdf

    ##### 2.5 挂起和重新运行线程 挂起线程意味着暂停线程的执行,而重新运行则是恢复线程的执行。这种操作对于控制线程间的执行顺序非常有用。 ##### 2.6 等待线程结束 等待线程结束意味着主线程会阻塞直到被等待的...

    VB.NET多线程编程技术

    2. **线程控制**:除了启动线程外,还可以使用`Join()`方法等待线程结束,使用`Abort()`方法强制终止线程,以及通过属性如`IsAlive`来判断线程是否正在运行。 3. **线程同步**:为了避免多线程环境下数据竞争和死锁...

Global site tag (gtag.js) - Google Analytics