MFC教程(9)-- MFC的进程和线程(2)
2010-03-25 20:35:05 来源:WEB开发网模块-线程状态的创建
模块状态的成员模块-线程状态m_thread的创建类似于线程状态的创建:当第一次访问m_thread所对应的CThreadLocal模板对象时,给m_thread分配MFC线程局部存储的私有槽号m_nSlot,并动态地创建_AFX_MODULE_THREAD_STATE对象,保存对象指针在m_nSlot槽中。
创建过程所涉及的几个重要函数的算法
创建过程所涉及的几个重要函数的算法描述如下:
AllocSlot
AllocSlot用来分配线程的MFC私有存储空间的槽号。由于该函数要修改全局变量_afxThreadData,所以必须使用m_sect关键段对象来同步多个线程对该函数的调用。
CThreadSlotData::AllocSlot()
{
进入关键段代码(EnterCriticalSection(m_sect);)
搜索m_pSlotData,查找空槽(SLOT)
如果不存在空槽(第一次进入时,肯定不存在)
分配或再分配内存以创建新槽,指针m_pSlotData指向分配的地址。
得到新槽(SLOT)
标志该SLOT为已用
记录最新可用的SLOT到成员变量m_nRover中。
离开关键段代码(LeaveCriticalSection(m_sect);)
返回槽号
}
GetThreadValue
GetThreadValue用来获取调用线程的第slot个线程局部变量的值。每一个线程局部变量都占用一个且只一个槽位。
CThreadSlotData::GetThreadValue(int slot)
{
//得到一个CThreadData型的指针pData
//pData指向MFC线程私有存储空间。
//m_tlsIndex在_afxThreadData创建时由构造函数创建
pData=(CThreadData*)TlsGetValue(m_tlsIndex),。
如果指针空或slot>pData->nCount, 则返回空。
否则,返回pData
}
更多精彩
赞助商链接