为什么必须要使用CloseHandle关闭句柄

很多程序在创建线程都这样写的:

ThreadHandle = CreateThread(NULL,0,.....);

CloseHandel(ThreadHandle );

1,线程和线程句柄(Handle)不是一个东西,线程是在cpu上运行的.....(说不清楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。

2,线程是一种内核对象,系统维护着每一个内核对象,当每个内核对象引用记数为0时,系统就从内存中释放该对象,CloseHandle就是将该线程对象的引用记数减1。所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。

3,如果你CreateThread以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread等,就要保存这个句柄,使用完了在CloseHandle。如果你开了一个线程,而不需要对它进行如何干预,CreateThread后直接CloseHandle就行了。

所以

CloseHandel(ThreadHandle );

只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。

如果你觉得多了一个变量,也可以写为:

CloseHandel(CreateThread(NULL,0,.....));

时间: 2024-10-11 12:34:12

为什么必须要使用CloseHandle关闭句柄的相关文章

[转载]Dll注入技术之远程线程注入

转自:黑客反病毒 DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等.     远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLi

vc++高级班之多线程篇[7]---线程间的同步机制②

//示例代码: CStringArray g_ArrString; UINT __cdecl ThreadProc(LPVOID lpParameter) { int startIdx = (int)lpParameter; for (int idx = startIdx; idx < startIdx+100; ++idx) { CString str; str.Format(_T("%d"), idx); g_ArrString.Add(str); } return 0; }

window下线程同步之(Mutex(互斥器) )

使用方法: 1.创建一个互斥器:CreateMutex: 2.打开一个已经存在的互斥器:OpenMutex: 3.获得互斥器的拥有权:WaitForSingleObject.WaitForMultipleObjects 等一类等待的函数--(可能造成阻塞): 4.释放互斥器的拥有权:ReleaseMutex: 5.关闭互斥器:CloseHandle: 函数原型: HANDLE WINAPI CreateMutex( __in_opt LPSECURITY_ATTRIBUTES lpMutexAt

[Re] 安全知识点

DLL注入,即,把一个DLL文件放到目标进程中. 当一个进程的程序不是自己编写的,而我们又需要该程序加载指定的dll,以便进行某些操作,这是就需要dll注入. 当一个进程加载dll时,dll被映射到该进程的地址空间.dll注入的最大目的,进入目标进程的地址空间,这样就可以操作目标进程中的对象了. 注入方式: 1.远程线程注入步骤(假设事先写好DLL文件) OpenProcess()   //获取已知进程的句柄: VirtualAllocEx()   //在进程中申请空间: WriteProces

C++线程同步之事件

题目要求:点击抢红包后,先将第一个编辑框的值设置为1000,然后创建三个线程,让右边的编辑框值依次设置为1000(用事件完成) // MutexExDlg.h : 头文件 // #pragma once // CMutexExDlg 对话框 class CMutexExDlg : public CDialogEx { // 构造 public: CMutexExDlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 enum { IDD = IDD_MUTEX

c++线程同步之信号量

// MutexExDlg.h : 头文件 // #pragma once // CMutexExDlg 对话框 class CMutexExDlg : public CDialogEx { // 构造 public: CMutexExDlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 enum { IDD = IDD_MUTEXEX_DIALOG }; protected: virtual void DoDataExchange(CDataExchang

VC++自释放指针、自释放虚拟内存、自关闭句柄、局部作用域回调函数调用等辅助开发类

#pragma once #ifndef NULL #define NULL 0 #endif namespace RangeHelper { template <class T> class CAutoDeletePtr { //自动删除指针 public: CAutoDeletePtr() : m_ptr(NULL) { } CAutoDeletePtr(T* ptr) { m_ptr = ptr; } ~CAutoDeletePtr() { Free(); } void Free() {

CloseHandle(),TerminateThread(),ExitThread()的区别

线程的handle用处: 线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问.该内存块是一种数据结构,它的成员负责维护对象的各种信息(eg: 安全性描述,引用计数等). CloseHandle() 在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象. 但是这个handle并不能完全代表这个线程,它仅仅是线程的一

CloseHandle()函数的使用

CloseHandle()函数的使用?? 很多程序在创建线程都这样写的:............ThreadHandle = CreateThread(NULL,0,.....);CloseHandel(ThreadHandle );.....这不是刚好创建又关闭了吗?线程怎么运行呢? ================================================ Closing a thread handle does not terminate the associated