MFC教程(9)-- MFC的进程和线程(1)
2010-03-25 20:35:08 来源:WEB开发网CThreadSlotData的一些数据成员
在CThreadSlotData类的定义中所涉及的类或者结构定义如下:
(1)m_sect
m_sect是一个关键段变量,在_afxThreadData创建时初始化。因为_afxThreadData是一个全局变量,所以必须通过m_sect来同步多个线程对该变量的并发访问。
(2)m_nAlloc和m_pSlotData
m_nAlloc表示已经分配槽的数目,它代表了线程局部变量的个数。每一个线程局部变量都对应一个槽,每个槽对应一个线程局部变量。槽使用CSlotData类来管理。
CSlotData的定义如下:
struct CSlotData{
DWORD dwFlags; // slot flags (allocated/not allocated)
HINSTANCE hInst; // module which owns this slot
};
该结构用来描述槽的使用:
域dwFlags表示槽的状态,即被占用或者没有;
域hInst表示使用该槽的模块的句柄。
m_pSlotData表示一个CSlotData类型的数组,用来描述各个槽。该数组通过成员函数AllocSlot和FreeSlot来动态地管理,见图9-6。
(3)m_list
先讨论CThreadData 类。CThreadData定义如下:
struct CThreadData : public CNoTrackObject{
CThreadData* pNext; // required to be member of CSimpleList
int nCount; // current size of pData
LPVOID* pData; // actual thread local data (indexed by nSlot)
};
该结构用来描述CThreadSlotData为每个线程管理的线程局部空间:
域pNext把各个线程的CThreadData项目链接成一个表,即把各个线程的线程私有空间链接起来;
域nCount表示域pData的尺寸,即存储了多少个线程私有数据;
pData表示一个LPVOID类型的数组,数组中的每一个元素保存一个指针,即线程私有数据指针,该指针指向一个在堆中分配的真正存储线程私有数据的地址。数组元素的个数和槽的个数相同,每个线程局部变量(THREAD_LOCAL定义的变量)都有一个对应的槽号,用该槽号作为下标来引用pData。
m_list表示一个CThreadData类型的指针数组,数组中的各项指向各个线程的线程私有空间,每个线程在数组中都有一个对应项。该数组通过GetValue、SetValue、DeleteValues等成员函数来管理,见图9-6。
_afxThreadData
更多精彩
赞助商链接