Windows中的线程ID和线程句柄
1.什么是句柄?
-
本质是指针,在Win中句柄是指向指针的指针
typedef void *HANDLE;
-
一个应用程序,组成该程序的众多对象存在内存中
-
一般的理解是,只要获取了对象的内存地址便可以随意操作对象了,但是这个想法是不对的
-
因为Window是一个以虚拟内存为基础的操作系统
-
在Win下,windows的内存管理器经常在内存中移动对象,来满各种应用程序的需要,这就导致对象的地址发生变化
-
为应对这一情况,Windows系统专门在内存中腾出一块区域,用来登记对象在地址中的内存变化
- 可以理解为一张表格: 表中的每一项的内容都是程序各对象的地址,而句柄就是表格的每一格的地址
- 在系统的帮助之下,只要对象的地址变化,系统就用新的地址替换表格中的旧地址,因此我们只要记住句柄即可,因为句柄的地址不变
- 因此我们可以从句柄所指向的那块格子中获取到指定对象的地址
-
总结:
句柄地址(不变)--->记载着对象在内存中的地址--->对象在内存中的地址(不稳定)--->实际对象
2.线程ID和线程句柄
-
Win32API 的 CreateThread() 用于创建线程,同时返回线程句柄和线程ID
-
线程句柄(32位的指针)
线程句柄有线程对象的完全访问权 线程句柄是用来操作线程的 线程句柄是进程层面局部的 一个线程对象可以有多个线程句柄,每个句柄的访问权也可以不一样(好比有在两张纸上写下同一个门牌号)
-
线程ID
线程ID是系统级别线程的唯一标识符 线程ID是系统级别的 线程和ID唯一对应
-
区别
线程ID是系统级别的唯一标识符----线程句柄不唯一且是进程级别的 线程句柄一般用于操作线程 例如挂起、停止、设置优先级 用户可以通过线程ID获得进程或线程的HANDLE,多次得到的HANDLE并不一定是一样的