`

CloseHandle以及内核对象的释放

 
阅读更多
转自
http://blog.csdn.net/a102111/article/details/8501620


最近回顾了下多线程的东西,碰到CloseHandle函数,之前也碰到过,但是自己积累不足,所以也没理解明白。这次再次碰到,想想积累的也差不多了,索性就搞个明白。

函数说明
BOOL CloseHandle(HANDLE hObject);

参数
hObject :代表一个已打开对象handle。
返回值
TRUE:执行成功;
FALSE:执行失败,可以调用GetLastError()获知失败原因。


函数用于关闭一个内核对象。

CloseHandle到底做了什么?
    当调用CloseHandle成功后,相关的内核对象的引用计数被减1。
    这个函数做的工作就这么多。它并没有真正的关闭内核对象,只是将计数减1,也就是说,这个时候,如果这个内核对象的引用计数不为0的话,内核对象依然存在,如果你有办法找到他,那么你依然可以操作他。

    一个比较常见的问题:
    CreateThread后立即CloseHandle,为什么线程还在运行?
    可以这样认为,CreateThread之后,线程的内核对象的引用计数为2,CloseHandle之后,如果线程还没有结束,那么他的引用计数是1,不是0,此时,系统不会回收内核对象,所以线程还在执行。直到线程执行结束,引用计数变成了0,此时,系统回收。

内核对象什么时候被删除?
    以下两种情况,内核对象会被删除--系统回收:
    当内核对象的引用计数为0的时候
    进程结束后
    如果内核对象的引用计数不为0,但是相关的进程都已经结束了,那么该内核对象会被系统回收。

引用
参考:
    进程确实没有机会执行自己的清除操作,但是操作系统可以在进程之后进行全面的清除,使得所有操作系统资源都不会保留下来。这意味着进程使用的所有内存均被释放,所有打开的文件全部关闭,所有内核对象的使用计数均被递减,同时所有的用户对象和GDI对象均被撤消。
       ----摘自Windows核心编程 第四版 4.3.3


内核对象泄露
    内核对象在使用完毕之后,没有及时调用CloseHandle关闭,在该进程运行期间,将造成内核对象泄露。
    内核对象泄露会对系统造成一定程度的负面影响,但进程结束退出后,操作系统会自动回收这些内核对象。
分享到:
评论

相关推荐

    MFC两个线程中用事件内核对象通信

    1. **事件内核对象**:事件内核对象是Windows操作系统提供的一种同步机制,它可以处于已设置(Signaled)或未设置(Not Signaled)两种状态。当线程等待一个事件对象时,如果该事件对象处于已设置状态,线程会立即...

    自动事件重置内核对象

    在Windows操作系统中,内核对象是系统级的资源管理工具,它们用于进程间通信、同步以及线程调度等任务。自动事件重置内核对象是其中一种重要的同步机制,广泛应用于多线程程序设计中。本文将深入探讨自动事件重置...

    windows多线程总结

    - **关闭内核对象**:通过`CloseHandle()`函数声明结束对内核对象的访问,系统会删除句柄表中的记录,并检查使用计数来决定是否释放对象。 - **内核对象的共享**:Windows内核对象支持两种共享方式:继承式共享...

    Windows多任务编程

    最后,当不再需要内核对象时,需要调用CloseHandle()函数关闭句柄,释放系统资源。这个函数会减少对象引用计数,当计数归零时,系统会自动删除对象。 通过深入理解并熟练掌握Windows的内核对象、进程、线程以及相关...

    Windows临界区,内核事件,互斥量,信号量

    临界区对象不是内核对象,因此它不占用系统资源,响应速度较快,能实现高效的同步。 #### 结构定义和函数调用: - 初始化临界区:`InitializeCriticalSection`,这是创建临界区对象后必须调用的第一个函数,用于...

    化工大学Windows多线程编程.pptx

    例如,`CreateMutex`、`CreateEvent`等用于创建内核对象,而`CloseHandle`函数用于关闭不再需要的对象,释放系统资源。 进入线程编程的话题,线程是进程内的执行单元,可以并行执行任务。主线程在进程启动时自动...

    Delphi多线程之Semaphore_(信号对象).pdf

    4. 最后,作为系统内核对象,需要用 CloseHandle 函数关闭 Semaphore 对象。 在使用 Semaphore 时,需要注意以下几点: * 信号总数表示 Semaphore 的最大处理能力,例如银行的业务窗口数目。 * 初始信号数表示 ...

    进程间串口共享

    这种技术基于Windows内核对象的复制机制,使得多个进程可以同步、高效地进行数据传输,既提高了资源利用率,也简化了多进程之间的通信。下面将详细阐述这一知识点。 首先,我们需要理解什么是串口。串口,全称串行...

    C++大文件处理

    为了指定文件映射对象需要多大的物理存储空间还需要通过CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。在创建了文件映射对象后,还必须为文件数据保留一个地址空间...

    精选_NT驱动程序与用户层程序基于事件EVENT实现同步通信_源码打包

    学习这个例子,开发者可以深入理解内核对象在系统编程中的作用,以及如何在驱动程序和用户层程序之间实现高效、安全的同步。通过阅读和分析源码,可以提升在实际项目中的编程技巧,为解决复杂的系统级问题打下基础...

    SetEvent and ResetEvent manual

    事件对象在Windows系统中是一个内核对象,它可以处于信号状态(Signaled)或无信号状态(Not Signaled)。当调用SetEvent时,如果事件对象当前是无信号状态,它会被设置为信号状态,这会唤醒所有等待该事件的对象。...

    OSR_ShareMemoryAndEvent

    1. **内核对象**:Windows中的事件是一个内核对象,可以被驱动程序和应用程序使用。有三种类型的事件:手动重置事件、自动重置事件和匿名事件。 2. **创建事件**:`CreateEvent`函数用于创建事件对象,可以设置初始...

    操作系统实验教案打印版一.pdf

    CloseHandle()是一个Windows API函数,用于关闭一个内核对象句柄。当应用程序不再需要一个对象句柄时,应该调用此函数来释放与句柄相关的资源。其函数原型为BOOL CloseHandle(HANDLE hObject)。 7. 线程同步机制 在...

    内存映射文件使用方法.pdf

    在使用内存映射文件时,首先要通过`CreateFile()`函数创建或打开一个文件内核对象,这个对象代表了磁盘上的文件。`CreateFile()`函数需要指定文件的访问权限(如只读、读写等)和共享模式。接着,使用`...

    在同步代码结束后,使用ReleaseMutex(THandle

    临界区在没有线程冲突时,要用10~15个时间片,而事件对象由于涉及到系统内核要用400~600个时间片。 使用互斥的步骤: 1、声明一个类型为Thandle或Hwnd的全局变量,其实都是Cardinal类型。Hwnd是handle of window,...

    易语言时间校准

    6. **关闭内核对象**:在使用完计时器或其他内核对象后,为了释放系统资源,需要正确关闭它们。在易语言中,这可以通过调用CloseHandle函数来实现。不关闭内核对象可能导致资源泄露,影响程序的稳定性和性能。 综上...

    WIN32程序的C++编程

    Win32 API中的CreateFile、CreateMutex等函数用于创建和管理各种系统资源,而CloseHandle函数则用于释放这些资源。此外,线程和进程管理也是Win32编程的一部分,包括线程的创建、同步和通信,以及进程的创建和控制。...

    VC++定时器,比SetTimer更精确

    这种方式创建的定时器基于内核对象,其精度可以达到纳秒级,远高于`SetTimer`。以下是使用这种技术的基本步骤: 1. **创建定时器**: 使用`CreateWaitableTimer`函数创建一个可等待的定时器对象,设定初始状态为未...

Global site tag (gtag.js) - Google Analytics