线程ID和线程句柄有什么区别?为什么两者都需要? Windows 和 Linux 有区别吗?
据我所知,Linux 的 pthread 库没有线程句柄的概念。 pthread_create 和其他 pthreads 函数,返回线程 ID。
在 Windows 下,线程句柄与线程 ID 不同,就像文件句柄与文件名不同一样。
线程句柄是一个令牌,它允许您对线程执行某些操作(通常是等待它或杀死它)。 Win32 为许多对象提供了这些标记,通常将它们称为 HANDLE。
令牌本质上是一个指向正在运行(或停止)的线程的指针,并且具有一组与之相关的功能,例如,您可以拥有一个允许您等待但不能杀死线程的句柄。以同样的方式,我们可以拥有一个只读的文件句柄。
这种间接级别可能有用,也可能没用,但这是 Win32 的方式,并且它与它处理某些其他类型对象的方式大致一致。
ID是系统中运行的线程的唯一数字标识符。与任何内核对象句柄一样,线程句柄可以被视为一种特殊类型的指向内核对象的引用计数指针。
因此在内核空间中有一个 ID = 12345 的 THREAD 类型的对象
并且因为您想要对线程执行某些操作,所以您的地址空间中有一个名为 threadID 的指针,其值为 44。
请注意,同一内核对象的不同句柄具有不同的值(两个指针指向一个对象),并且内核对象可以在多个进程中拥有句柄。
线程 ID 是渐进的(即一个接一个),您可以遍历它。 线程句柄与 Windows 中的大多数句柄一样,实际上是指针。 例如,您可以使用线程句柄设置线程属性位,但不能使用线程 ID。
CreateThread
的直接结果。但句柄(只是一个“不透明指针”)仅在给定进程的地址空间中有效。另一方面,特定线程的 ID 在整个系统中是唯一的。因此可以通过调用 OpenThread
函数来获取句柄。另一个可用于使用其 ID 直接作用于线程的函数是
。