- 浏览: 369854 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
转自
http://blog.csdn.net/a102111/article/details/8501620
最近回顾了下多线程的东西,碰到CloseHandle函数,之前也碰到过,但是自己积累不足,所以也没理解明白。这次再次碰到,想想积累的也差不多了,索性就搞个明白。
函数说明
参数
hObject :代表一个已打开对象handle。
返回值
TRUE:执行成功;
FALSE:执行失败,可以调用GetLastError()获知失败原因。
函数用于关闭一个内核对象。
CloseHandle到底做了什么?
当调用CloseHandle成功后,相关的内核对象的引用计数被减1。
这个函数做的工作就这么多。它并没有真正的关闭内核对象,只是将计数减1,也就是说,这个时候,如果这个内核对象的引用计数不为0的话,内核对象依然存在,如果你有办法找到他,那么你依然可以操作他。
一个比较常见的问题:
CreateThread后立即CloseHandle,为什么线程还在运行?
可以这样认为,CreateThread之后,线程的内核对象的引用计数为2,CloseHandle之后,如果线程还没有结束,那么他的引用计数是1,不是0,此时,系统不会回收内核对象,所以线程还在执行。直到线程执行结束,引用计数变成了0,此时,系统回收。
内核对象什么时候被删除?
以下两种情况,内核对象会被删除--系统回收:
当内核对象的引用计数为0的时候
进程结束后
如果内核对象的引用计数不为0,但是相关的进程都已经结束了,那么该内核对象会被系统回收。
内核对象泄露
内核对象在使用完毕之后,没有及时调用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
进程确实没有机会执行自己的清除操作,但是操作系统可以在进程之后进行全面的清除,使得所有操作系统资源都不会保留下来。这意味着进程使用的所有内存均被释放,所有打开的文件全部关闭,所有内核对象的使用计数均被递减,同时所有的用户对象和GDI对象均被撤消。
----摘自Windows核心编程 第四版 4.3.3
内核对象泄露
内核对象在使用完毕之后,没有及时调用CloseHandle关闭,在该进程运行期间,将造成内核对象泄露。
内核对象泄露会对系统造成一定程度的负面影响,但进程结束退出后,操作系统会自动回收这些内核对象。
发表评论
-
FreeRTOS
2022-03-05 16:31 248Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 411https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1325https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 477https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 574// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 580https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5738583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 600参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2155基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9061 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1582OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1881ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 871转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1908转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1086C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 969转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 991转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 810参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1612转自 http://blog.csdn.net/weixinh ...
相关推荐
1. **事件内核对象**:事件内核对象是Windows操作系统提供的一种同步机制,它可以处于已设置(Signaled)或未设置(Not Signaled)两种状态。当线程等待一个事件对象时,如果该事件对象处于已设置状态,线程会立即...
在Windows操作系统中,内核对象是系统级的资源管理工具,它们用于进程间通信、同步以及线程调度等任务。自动事件重置内核对象是其中一种重要的同步机制,广泛应用于多线程程序设计中。本文将深入探讨自动事件重置...
- **关闭内核对象**:通过`CloseHandle()`函数声明结束对内核对象的访问,系统会删除句柄表中的记录,并检查使用计数来决定是否释放对象。 - **内核对象的共享**:Windows内核对象支持两种共享方式:继承式共享...
最后,当不再需要内核对象时,需要调用CloseHandle()函数关闭句柄,释放系统资源。这个函数会减少对象引用计数,当计数归零时,系统会自动删除对象。 通过深入理解并熟练掌握Windows的内核对象、进程、线程以及相关...
临界区对象不是内核对象,因此它不占用系统资源,响应速度较快,能实现高效的同步。 #### 结构定义和函数调用: - 初始化临界区:`InitializeCriticalSection`,这是创建临界区对象后必须调用的第一个函数,用于...
例如,`CreateMutex`、`CreateEvent`等用于创建内核对象,而`CloseHandle`函数用于关闭不再需要的对象,释放系统资源。 进入线程编程的话题,线程是进程内的执行单元,可以并行执行任务。主线程在进程启动时自动...
4. 最后,作为系统内核对象,需要用 CloseHandle 函数关闭 Semaphore 对象。 在使用 Semaphore 时,需要注意以下几点: * 信号总数表示 Semaphore 的最大处理能力,例如银行的业务窗口数目。 * 初始信号数表示 ...
这种技术基于Windows内核对象的复制机制,使得多个进程可以同步、高效地进行数据传输,既提高了资源利用率,也简化了多进程之间的通信。下面将详细阐述这一知识点。 首先,我们需要理解什么是串口。串口,全称串行...
为了指定文件映射对象需要多大的物理存储空间还需要通过CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。在创建了文件映射对象后,还必须为文件数据保留一个地址空间...
学习这个例子,开发者可以深入理解内核对象在系统编程中的作用,以及如何在驱动程序和用户层程序之间实现高效、安全的同步。通过阅读和分析源码,可以提升在实际项目中的编程技巧,为解决复杂的系统级问题打下基础...
事件对象在Windows系统中是一个内核对象,它可以处于信号状态(Signaled)或无信号状态(Not Signaled)。当调用SetEvent时,如果事件对象当前是无信号状态,它会被设置为信号状态,这会唤醒所有等待该事件的对象。...
1. **内核对象**:Windows中的事件是一个内核对象,可以被驱动程序和应用程序使用。有三种类型的事件:手动重置事件、自动重置事件和匿名事件。 2. **创建事件**:`CreateEvent`函数用于创建事件对象,可以设置初始...
CloseHandle()是一个Windows API函数,用于关闭一个内核对象句柄。当应用程序不再需要一个对象句柄时,应该调用此函数来释放与句柄相关的资源。其函数原型为BOOL CloseHandle(HANDLE hObject)。 7. 线程同步机制 在...
在使用内存映射文件时,首先要通过`CreateFile()`函数创建或打开一个文件内核对象,这个对象代表了磁盘上的文件。`CreateFile()`函数需要指定文件的访问权限(如只读、读写等)和共享模式。接着,使用`...
临界区在没有线程冲突时,要用10~15个时间片,而事件对象由于涉及到系统内核要用400~600个时间片。 使用互斥的步骤: 1、声明一个类型为Thandle或Hwnd的全局变量,其实都是Cardinal类型。Hwnd是handle of window,...
6. **关闭内核对象**:在使用完计时器或其他内核对象后,为了释放系统资源,需要正确关闭它们。在易语言中,这可以通过调用CloseHandle函数来实现。不关闭内核对象可能导致资源泄露,影响程序的稳定性和性能。 综上...
Win32 API中的CreateFile、CreateMutex等函数用于创建和管理各种系统资源,而CloseHandle函数则用于释放这些资源。此外,线程和进程管理也是Win32编程的一部分,包括线程的创建、同步和通信,以及进程的创建和控制。...
这种方式创建的定时器基于内核对象,其精度可以达到纳秒级,远高于`SetTimer`。以下是使用这种技术的基本步骤: 1. **创建定时器**: 使用`CreateWaitableTimer`函数创建一个可等待的定时器对象,设定初始状态为未...