一个令人尴尬的问题:线程ID和线程句柄之间有什么区别?为什么两者都需要? Windows和Linux之间有区别吗?
答案 0 :(得分:16)
据我所知,Linux的pthread库没有线程句柄的概念。 pthread_create和其他pthreads函数,返回一个线程ID。
在Windows下,线程句柄与线程ID不同,就像文件句柄与文件名不同。
线程句柄是一个令牌,它允许你对线程做一些事情(通常等待或杀死它)。 Win32拥有许多对象的这些令牌,并且通常称它们为HANDLE。
令牌本质上是运行(或停止)线程的指针,并具有一组与之关联的能力,例如,您可以拥有一个允许您等待但不能杀死线程的句柄。以同样的方式,我们可以有一个只读的文件句柄。
这种间接的方式可能有用,也可能没有用,但这是Win32的做法,它与处理其他类型对象的方式大体一致。
答案 1 :(得分:5)
ID是系统中运行的线程的唯一数字标识符。与任何内核对象句柄一样,线程句柄可以看作是指向内核对象的特殊类型的引用计数指针。
在内核空间中有一个THREAD类型的对象,ID = 12345
因为你想对线程做一些事情,你的地址空间中有一个指针,称为一个值为44的threadID。
请注意,同一内核对象的不同句柄具有不同的值(指向一个对象的两个指针),并且内核对象可以在多个进程中具有句柄。
答案 2 :(得分:3)
线程ID是渐进式的(即,一个接一个),您可以遍历。 与Windows中的大多数句柄一样,线程句柄实际上是指针。 例如,您可以使用线程句柄设置线程属性位 - 但不能使用线程ID。