关于句柄泄漏及线程核心对象,该如何解决
关于句柄泄漏及线程核心对象
侯捷翻译的<<win32多线程程序设计>>中有这么一段话。
HANDLE是指向“线程核心对象”,而不是线程本身。这句话让我有点小疑惑。后续的问题来了。
如果没调用CloseHandle,即使线程结束,内核对象的引用计数在进程结束前不会变为0,那么内核对象就不会删除。这时,该句柄就算泄漏了吧。那么句柄指向的内核对象同样也算泄漏了吧。
所以,这里是不是同时泄漏了2个东西?另外,“线程核心对象”里应该有包含线程本身地址之类的吧
------解决方案--------------------
这样理解基本没错
这里是不是同时泄漏了2个东西?
HANDLE 实际上是一个索引ID, 这个算不上泄漏
KTHREAD 才是实际的对象
“线程核心对象”里应该有包含线程本身地址之类的吧,
是的, 对象有很多东西
侯捷翻译的<<win32多线程程序设计>>中有这么一段话。
HANDLE是指向“线程核心对象”,而不是线程本身。这句话让我有点小疑惑。后续的问题来了。
如果没调用CloseHandle,即使线程结束,内核对象的引用计数在进程结束前不会变为0,那么内核对象就不会删除。这时,该句柄就算泄漏了吧。那么句柄指向的内核对象同样也算泄漏了吧。
所以,这里是不是同时泄漏了2个东西?另外,“线程核心对象”里应该有包含线程本身地址之类的吧
------解决方案--------------------
这样理解基本没错
这里是不是同时泄漏了2个东西?
HANDLE 实际上是一个索引ID, 这个算不上泄漏
KTHREAD 才是实际的对象
“线程核心对象”里应该有包含线程本身地址之类的吧,
是的, 对象有很多东西
// Size 1C0
typedef struct _KTHREAD_XP
{
/*0x000*/ struct _DISPATCHER_HEADER Header;
/*0x010*/ struct _LIST_ENTRY MutantListHead;
/*0x018*/ VOID* InitialStack;
/*0x01C*/ VOID* StackLimit;
/*0x020*/ VOID* Teb;
/*0x024*/ VOID* TlsArray;
/*0x028*/ VOID* KernelStack;
/*0x02C*/ UINT8 DebugActive;
/*0x02D*/ UINT8 State;
/*0x02E*/ UINT8 Alerted[2];
/*0x030*/ UINT8 Iopl;
/*0x031*/ UINT8 NpxState;
/*0x032*/ CHAR Saturation;
/*0x033*/ CHAR Priority;
/*0x034*/ struct _KAPC_STATE ApcState;
/*0x04C*/ ULONG32 ContextSwitches;
/*0x050*/ UINT8 IdleSwapBlock;
/*0x051*/ UINT8 Spare0[3];
/*0x054*/ LONG32 WaitStatus;
/*0x058*/ UINT8 WaitIrql;
/*0x059*/ CHAR WaitMode;
/*0x05A*/ UINT8 WaitNext;
/*0x05B*/ UINT8 WaitReason;
/*0x05C*/ struct _KWAIT_BLOCK* WaitBlockList;
union
{
/*0x060*/ struct _LIST_ENTRY WaitListEntry;
/*0x060*/ struct _SINGLE_LIST_ENTRY SwapListEntry;
};
/*0x068*/ ULONG32 WaitTime;
/*0x06C*/ CHAR BasePriority;
/*0x06D*/ UINT8 DecrementCount;
/*0x06E*/ CHAR PriorityDecrement;
/*0x06F*/ CHAR Quantum;
/*0x070*/ struct _KWAIT_BLOCK WaitBlock[4];
/*0x0D0*/ VOID* LegoData;
/*0x0D4*/ ULONG32 KernelApcDisable;
/*0x0D8*/ ULONG32 UserAffinity;
/*0x0DC*/ UINT8 SystemAffinityActive;
/*0x0DD*/ UINT8 PowerState;
/*0x0DE*/ UINT8 NpxIrql;
/*0x0DF*/ UINT8 InitialNode;
/*0x0E0*/ VOID* ServiceTable;
/*0x0E4*/ struct _KQUEUE* Queue;
/*0x0E8*/ ULONG32 ApcQueueLock;
/*0x0EC*/ UINT8 _PADDING0_[0x4];
/*0x0F0*/ struct _KTIMER Timer;
/*0x118*/ struct _LIST_ENTRY QueueListEntry;
/*0x120*/ ULONG32 SoftAffinity;
/*0x124*/ ULONG32 Affinity;
/*0x128*/ UINT8 Preempted;
/*0x129*/ UINT8 ProcessReadyQueue;
/*0x12A*/ UINT8 KernelStackResident;
/*0x12B*/ UINT8 NextProcessor;
/*0x12C*/ VOID* CallbackStack;