AfxBeginThread和AfxEndThread及线程资源分配和释放

简介:

 AfxBeginThread动态创建CWinThread(或派生类)线程对象,并分配相关资源.

AfxEndThread会释放线程资源和CWinThread(或派生类)线程对象.
下面这个过程的分析,这里仅仅给出简单代码用于说明问题.
首先看一下创建线程的函数.
 
 
  1. CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass, 
  2.     int nPriority, UINT nStackSize, DWORD dwCreateFlags, 
  3.     LPSECURITY_ATTRIBUTES lpSecurityAttrs) 
  4.   ...... 
  5.  
  6.     // 创建线程对象.CreateObject()函数内部有new操作符. 
  7.     CWinThread* pThread = (CWinThread*)pThreadClass->CreateObject(); 
  8.  
  9.     // 创建线程. 
  10.     pThread->m_pThreadParams = NULL; 
  11.     pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize, lpSecurityAttrs) 
  12.  
  13.     return pThread; 
注意红色的文字,CreateObject()函数内适用new操作符创建线程对象CWinThread或者其派生类对象.
 
下面是CreateThread函数.
 
 
  1. BOOL CWinThread::CreateThread(DWORD dwCreateFlags, UINT nStackSize, 
  2.     LPSECURITY_ATTRIBUTES lpSecurityAttrs) 
  3.     ... ... 
  4.     // create the thread (it may or may not start to run) 
  5.     m_hThread = (HANDLE)(ULONG_PTR)_beginthreadex(lpSecurityAttrs, nStackSize,   
  6.     &_AfxThreadEntry, &startup, dwCreateFlags | CREATE_SUSPENDED, (UINT*)&m_nThreadID); 
  7.     ... ... 
  8.     return TRUE; 
这个函数调用_beginthreadex创建线程.
注意线程回调函数_AfxThreadEntry,下面是其部分代码.
 
  1. UINT APIENTRY _AfxThreadEntry(void* pParam) 
  2.     _AFX_THREAD_STARTUP* pStartup = (_AFX_THREAD_STARTUP*)pParam; 
  3.  
  4.     CWinThread* pThread = pStartup->pThread; 
  5.      
  6.     ... ... 
  7.     // forced initialization of the thread 
  8.     AfxInitThread(); 
  9.  
  10.   ... ... 
  11.      
  12.     AfxEndThread(nResult); 
  13.  
  14.     return 0;   // not reached 
这个函数调用了函数AfxEndThread().从这里可以看出,若CWinThread(获取派生类)对象如果能够从线程函数正常返回,一定会调用AfxEndThread()函数. 
下面是AfxEndThread函数的代码.
 
 
  1. void AFXAPI AfxEndThread(UINT nExitCode, BOOL bDelete) 
  2.     ... ... 
  3.     pThread->Delete(); 
  4.  
  5.     // allow cleanup of any thread local objects 
  6.     AfxTermThread(); 
  7.  
  8.     // allow C-runtime to cleanup, and exit the thread 
  9.     _endthreadex(nExitCode); 
  10.  
  11. void CWinThread::Delete() 
  12.     // delete thread if it is auto-deleting 
  13.     if (m_bAutoDelete) 
  14.         delete this
从注释和代码可以看出,该函数用来释放资源和CWinThread对象(delete this).
 
从上面的分析可以看出, 函数调用AfxBeginThread可以动态创建CWinThread(或派生类)对象,如果能够保证程序正常从线程回调函数退出(也就是CWinThread::Run()函数),就能够保证线程对象及资源被正确释放.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 







本文转自jetyi51CTO博客,原文链接:http://blog.51cto.com/jetyi/1074783,如需转载请自行联系原作者



相关文章
|
7月前
|
存储 安全 Java
剑指JUC原理-4.共享资源和线程安全性(上)
剑指JUC原理-4.共享资源和线程安全性
82 1
|
缓存 安全 Java
【JavaSE专栏78】线程同步,控制多个线程之间的访问顺序和共享资源的安全性
【JavaSE专栏78】线程同步,控制多个线程之间的访问顺序和共享资源的安全性
|
21天前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
55 0
|
4月前
|
存储 NoSQL Java
Tair的发展问题之Tair对于不同存储介质(如内存和磁盘)的线程分配是如何处理的
Tair的发展问题之Tair对于不同存储介质(如内存和磁盘)的线程分配是如何处理的
|
6月前
|
Java
在Java中,死锁是指两个或多个线程互相等待对方释放资源,从而导致所有线程都无法继续执行的情况。
【6月更文挑战第24天】在Java并发中,死锁是多线程互相等待资源导致的僵局。避免死锁的关键策略包括:防止锁嵌套,设定固定的加锁顺序,使用`tryLock`带超时,避免无限等待,减少锁的持有时间,利用高级同步工具如`java.util.concurrent`,以及实施死锁检测和恢复机制。通过这些方法,可以提升程序的并发安全性。
45 1
|
5月前
|
Java Go 调度
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
|
6月前
|
Java
死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`
【6月更文挑战第20天】死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`volatile`保证变量的可见性和部分原子性,确保多线程环境中值的即时更新。与`synchronized`相比,`volatile`作用于单个变量,不保证原子操作,同步范围有限,但开销较小。`synchronized`提供更全面的内存语义,保证原子性和可见性,适用于复杂并发控制。
48 3
|
5月前
|
存储 安全 Java
Java面试题:假设你正在开发一个Java后端服务,该服务需要处理高并发的用户请求,并且对内存使用效率有严格的要求,在多线程环境下,如何确保共享资源的线程安全?
Java面试题:假设你正在开发一个Java后端服务,该服务需要处理高并发的用户请求,并且对内存使用效率有严格的要求,在多线程环境下,如何确保共享资源的线程安全?
71 0
|
7月前
|
安全 Windows
LabVIEW分配多少线程?
LabVIEW分配多少线程?
56 1
|
7月前
|
监控 网络协议 iOS开发
程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案
程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案
241 0

相关实验场景

更多