线程 ID vs. 线程句柄

15

线程 ID 和线程句柄有什么区别?为什么两者都需要?Windows 和 Linux 之间是否有区别?

3个回答

19

据我所知,Linux的pthread库没有线程句柄的概念。pthread_create和其他pthread函数返回一个线程ID。

在Windows中,线程句柄与线程ID不同,就像文件句柄与文件名不同一样。

线程句柄是一个令牌,允许您对线程进行一些操作(通常是等待或终止线程)。 Win32对许多对象都有这些令牌,并通常称为HANDLE。

该令牌本质上是指向正在运行(或停止)的线程的指针,并具有与其相关联的一组功能。例如,你可以拥有一个允许您等待但不终止线程的句柄。同样地,我们也可以有一个只读的文件句柄。

这种间接层级可能有用,也可能无用,但这是Win32的实现方式,并且与其处理其他某些类型的对象的方式基本一致。


6

ID是系统中正在运行的线程的唯一数字标识符。线程句柄(像任何内核对象句柄一样)可以被视为对内核对象的特殊类型的引用计数指针。

因此,在内核空间中,存在一个类型为THREAD且ID = 12345的对象。

因为您想要执行某些操作,所以在您的地址空间中有一个名为threadID的指针,其值为44。

请注意,对同一内核对象的不同句柄具有不同的值(一个对象的两个指针),并且内核对象可以在多个进程中具有句柄。


4

线程ID是递增的(即,一个接一个),您可以遍历它们。 线程句柄(handle)像Windows中的大多数句柄一样,实际上是指针。 例如,您可以使用线程句柄设置线程属性位 - 但不能使用线程ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接