【发布时间】:2011-07-03 09:09:50
【问题描述】:
线程 ID 和线程句柄有什么区别?为什么两者都需要? Windows 和 Linux 有区别吗?
【问题讨论】:
标签: windows linux multithreading operating-system
线程 ID 和线程句柄有什么区别?为什么两者都需要? Windows 和 Linux 有区别吗?
【问题讨论】:
标签: windows linux multithreading operating-system
ID 是系统中运行的线程的唯一数字标识符。线程句柄与任何内核对象句柄一样,可以看作是一种特殊类型的内核对象引用计数指针。
所以在内核空间中有一个 THREAD 类型的对象,ID = 12345
因为你想对线程做一些事情,所以你的地址空间中有一个指针,称为 threadID,值为 44。
请注意,同一个内核对象的不同句柄具有不同的值(两个指针指向一个对象),并且内核对象可以在多个进程中拥有句柄。
【讨论】:
据我所知,Linux 的 pthread 库没有线程句柄的概念。 pthread_create 和其他 pthreads 函数,返回一个线程 ID。
在 Windows 下,线程句柄与线程 ID 不同,就像文件句柄与文件名不同。
线程句柄是一个令牌,它允许您对线程执行某些操作(通常等待或终止它)。 Win32 有很多对象的这些标记,并且通常将它们称为 HANDLE。
令牌本质上是一个指向正在运行(或已停止)的线程的指针,并具有一组与之相关的能力,例如,您可以拥有一个句柄,允许您等待但不能杀死线程。同理,我们可以有一个只读的文件句柄。
这种间接级别可能有用,也可能没用,但它是 Win32 的处理方式,并且与它处理某些其他类型对象的方式大体一致。
【讨论】:
线程 ID 是渐进式的(即一个接一个),您可以遍历它。 线程句柄,就像 Windows 中的大多数句柄一样,实际上是指针。 例如,您可以使用线程句柄设置线程属性位 - 但不是线程 ID。
【讨论】: