CreateThread()传回两个值,用以识别一个新的线程。第一个值是个Handle,  这也是CreateThread()的返回值,大部分与线程有关的API函数都需要它。第二个值是由lpThreadId带回来的线程ID。线程ID是一个全局变量,可以独一无二地表示系统中任一进程中的某个线程。AttachThreadInput()和PostThreadMessage()就需要用到线程ID,这两个函数允许你影响其他人(线程)的消息队列。调试器和进程观察器也需要  线程ID,为了安全防护的缘故,你不可能根据线程的ID而获得其handle。
  CreateThread()传回来的handle被称为一个核心对象(kernal Object)。核心对象其实和所谓的GDI对象,如画笔,画刷或DC是差不多的,只不过它由Kernel.dll来管理,而画笔,画刷由GDI32.dll来管理。两种对象之间有许多相似性。
  GDI对象是Windows的基础部分。在Win16或Win32中它们都是由操作系统管理。通常你不需要知道其数据格式。例如,你可能会调用SelectObject()或ReleaseObject()以处理GDI对象:Windows隐藏了实现细节,只是给你一个HDC或者一个HBRUSH,那都是对象的handle。
  核心对象以HANDLE为使用时的参考依据,与GDI的HBRUSH,HPEN,HPALETTE以及其他handles不同的是,只有一种handle可以代表核心对象。所谓handle,其实是个指针,指向操作系统内存空间的某样东西,那东西不允许你直接取得。你的程序不能够直接取用它,为的是维护系统的完整性与安全性。

 下面是各种Win32核心对象的清单。

  1)进程(processes)

  2)线程(threads)

  3)  文件(files)

  4)事件(events)

  5)信号量(semaphores)

  6)互斥器(mutexes)

  7)管道(Pipes,分为named和anonymous两种)

  其中事件,信号量,互斥器,这些核心对象可以用来整合许多的线程或进程。

  注意:Critical Sections(临界区域、关键区域)并不是核心对象。

  GDI对象和核心对象之间有一个主要的不同,GDI对象有单一拥有者,不是进程就是线程。核心对象可以有一个以上的拥有者,甚至可以跨进程。为了保持对每一位拥有者的追踪,核心对象保持了一个引用计数器,以记录有多少handles对应次对象,对象中也记录了那一个进程或线程是拥有者。如果你调用CreateThread()或是其它会传回handle的函数,引用计数便累加1.当你调用CloseHandle()时,引用计数便递减1.一旦引用计数降至0,这一核心对象即自动被摧毁。

  面对一个打开的对象,区分其拥有者是进程或者是线程。是件很重要的事情。因为这回=会决定系统何时做清除善后(clean up)操作。所谓
clean up操作,包括将该进程或线程所拥有的每一个对象的引用计数减1,若有必要,则对象会被摧毁掉。程序员不能选择由进程或者线程拥有对象,一切得视对象类型而定。
由于引用计数的设计,对象有可能在产生该对象之进程结束之后还继续幸存。Win32提供各种机制,让其他进程得以取得一个核心对象的handle。如果某个进程握有某个核心对象的handle,而该对象的原创者(进程)已经“作古”了,次核心对象并不会被摧毁。
  CloseHandle()的重要性

当你完成你的工作后,应该调用CloseHandle释放核心对象。

 BOOL  CloseHandle(HANDLE hObject);

  参数
    hObject          代表一个已打开之对象handle
    返回值

  如果成功,CloseHandle()返回TRUE,如果失败则传回FALSE.此时你可以调用GetLastError()获知失败原因。

如果一个进程没有在结束之前对它所打开的核心对象调用CloseHandle(),操作系统会自动把哪些对象的引用计数下降1.虽然你可以依赖系统做实体(physical)上的清除(cleanup)工作,然而逻辑上的清楚工作又是完全不同的一回事,特别是如果你有多个进程的话,因为系统并不知道对象实际代表什么意义,
所以它不可能知道解构顺序是否重要。
       如果一个进程常常产生“worker 线程”而老是不关闭线程的handle,那么这个进程可能最终有数百甚至数千个开启的“线程核心对象”留给操作系统去清理,这样的资源泄漏可能会对效率带来负面的影响。
      你不可以依赖“因线程的结束而清理所有被这一线程产生的核心对象”。虚度对象,例如文件,是被进程所拥有,而非被线程拥有。在进程结束之前不能够清理它们。

Win32多线程之核心对象的更多相关文章

  1. Java多线程编程核心 - 对象及变量的并发访问

    1.什么是“线程安全”与“非线程安全”? “非线程安全”会在多个线程对同一对象总的实例变量进行并发访问时发生,产生的后果是“脏读”,也就是取到的数据其实是被更改过的. “线程安全”是以获得的实例变量的 ...

  2. 深入浅出Win32多线程程序设计之基本概念

    一.深入浅出Win32多线程程序设计之基本概念[转] 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓 ...

  3. 多线程学习:win32多线程编程基本概念(转)

    一.定义: 1.进程和线程的区别 进程:是程序的执行过程,具有动态性,即运行的程序就叫进程,不运行就叫程序 ,每个进程包含一到多个线程.线程:系统中的最小执行单元,同一进程中有多个线程,线程可以共享资 ...

  4. Win32多线程编程(1) — 基础概念篇

      内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...

  5. win32多线程-重写消息循环

    最近正在学习<win32多线程程序设计>,这是其中一段重写消息循环的代码事例,以后可能用的上. while (!quit || gNumPrinting > 0) { // Wait ...

  6. Win32多线程编程(3) — 线程同步与通信

      一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...

  7. Win32 多线程的创建方法和基本使用

    Win32多线程的创建方法主要有: (1)CreateThread() (2)_beginthread()&&_beginthreadex() (3)AfxBeginThread() ...

  8. win32多线程程序设计笔记(第二章)

    第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点. 一.创建线程 与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主程序同时执行的程序来调用 ...

  9. win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)

    使用overlapped I/O并搭配event对象-----win32多线程-异步(asynchronous) I/O事例,会产生两个基础性问题. 第一个问题是,使用WaitForMultipleO ...

随机推荐

  1. github flow

    github flow Github flow 是Git flow的简化版,专门配合"持续发布".它是 Github.com 使用的工作流程 它只有一个长期分支,就是master, ...

  2. CodeForces 598B(循环数组)

    对于循环数组的问题,就是找偏移K后位置 偏移后位置=起始位置+(相对位置+K)%(长度+1) #include <iostream> #include <string> #in ...

  3. python 实现websocket

    python中websocket需要我们自己实现握手代码,流程是这样:服务端启动websocket服务,并监听.当客户端连接过来时,(需要我们自己实现)服务端就接收客户端的请求数据,拿到请求头,根据请 ...

  4. 在Pandas中直接加载MongoDB的数据

    在使用Pandas进行数据处理的时候,我们通常从CSV或EXCEL中导入数据,但有的时候数据都存在数据库内,我们并没有现成的数据文件,这时候可以通过Pymongo这个库,从mongoDB中读取数据,然 ...

  5. 通用CSS命名规范

    一.文件命名规范 样式文件命名主要的 master.css布局,版面 layout.css专栏 columns.css文字 font.css打印样式 print.css主题 themes.css [/ ...

  6. PoPo数据可视化周刊第一期

    PoPo数据可视化 聚焦于Web数据可视化领域, 发现前端可视化领域有意思的内容. 涵盖前端可视化领域最新资讯, 开源可视化库的发布更新消息, 可视化案例分析与讲解, 可视化技术文章, 可视化大神的日 ...

  7. 普通平衡树Tyvj1728、luogu P3369 (splay)

    存个模板,这次是splay的: 题目见这个题解: <--(鼠标移到这儿) 代码如下: #include<cstdio> #define INF 2147483647 using na ...

  8. arcgis10.2 serverstyle 制作工具位置 小计

    跟9.3时候的套路还是一样的,只是工具已经放到了arcgis desktop的安装目录的bin文件夹下面. engine和developerkit都不附带该工具. 但是engine会附带一组默认的转换 ...

  9. Python爬虫教程-01-爬虫介绍

    Spider-01-爬虫介绍 Python 爬虫的知识量不是特别大,但是需要不停和网页打交道,每个网页情况都有所差异,所以对应变能力有些要求 爬虫准备工作 参考资料 精通Python爬虫框架Scrap ...

  10. 一次线上bug引起的反思

    今天线上又出现了一个bug,而且代码是我写的.之前这个问题也出现过,不过由于每次情况都不同,改来改去总是改不完.之后领导知道后也很恼火,让测试把每种情况都测试了下,而我也又一次重新检查了下代码.当时确 ...