NPTL和POSIX线程有什么区别?

31

NPTL和POSIX线程之间的基本区别是什么?这两者是如何发展的?

3个回答

40

POSIX线程(pthread)不是实现,而是API规范(一份以英语书写的标准文件),其中包含多个名称以 pthread_ 开头的函数,它们在 <pthread.h> 头文件中定义。POSIX也是一组规范。

NPTL现在已经内置在Linux上的 GNU Libc 中,它是(或者至少非常努力地尝试成为)POSIX线程的一个实现。它是你的Linux系统上一堆源代码和二进制代码。 使用 gcc -pthread 编译并链接 -pthread 的应用程序今天在Linux上使用NPTL代码。

补充说明

存在pthread 的替代实现:在Linux上,MUSL Libc旨在符合Posix(这意味着具有pthread);在其他Posix系统(AIX、Solaris等)上,你也有pthread(但它们不是NPTL或Glibc)。


那么-lpthread-pthread都使用NPTL实现吗? - Anish Ramaswamy
是的,在大多数Linux系统上都可以(但您可以安装MUSL libc)。 - Basile Starynkevitch
@BasileStarynkevitch,我正在努力弄清楚musl如何不破坏与“-lpthread”链接的代码构建。我正在尝试使用musl构建我们的代码,该代码轻度使用pthread、mutex和cond。它可以成功构建和链接,但线程行为确实很奇怪。我查看了musl的配置脚本,但似乎没有任何特殊的pthread开关。 - user3342339

9
"POSIX线程"是一个定义线程API的“标准”。也就是说,它规定了系统中应该存在诸如
NPTL是一组功能,使得“Linux”(内核)能够高效地实现“POSIX线程”(标准)。
您可以在此处阅读有关NPTL及其产生背景的更多信息:这里

1
如果我理解正确的话,POSIX线程是在Linux中通过使用NPTL库实现的? - Whoami
我猜那是正确的。我添加了一个维基百科的链接[Google是你的朋友:)] - ArjunShankar

4
我想你最好的信息来源是从维基百科开始,并从那里跟随链接。
实际上并没有什么区别:NPTL只是当前Linux POSIX线程的实现,您仍然使用pthread_*函数族。早期在Linux历史上,使用了一个专用库称为libpthreads。 NPTL出现于2003年左右的2.6+内核中,有关更多详细信息,请参见上面的链接。
[顺便说一下:NPTL ==原生Posix线程库]

谢谢您的回复。那么,您的意思是NPTL和pthread都在使用相同的API,但实现方式不同? - Whoami
是的,没错。NPTL利用了Linux内核2.6.+引入的更先进的任务创建工具。 - fge
那么,我们是否有两组库,一组是针对NPTL的,另一组是针对pthread的?如果是这样,我该如何链接到NPTL库以供我的程序使用? - Whoami
不不不不。NPTL已经成为标准的POSIX线程库很长一段时间了。在切换时(7年前),是的,你必须做出选择,但现在它已经成为标准了。正如维基百科条目所说,它现在是glibc的标准,并且已经有很长一段时间了。 - fge
4
pthread并不等同于NPTL。pthread是一个标准,而NPTL则是Linux和GNU Libc实现它的方式。如果您在程序中调用pthread_*函数并包含pthread.h,并在相当新的GNU/Linux机器上编译和运行它,则它将固有地使用NPTL。POSIX线程是每个遵循POSIX标准的操作系统提供的一个特性。 - ArjunShankar

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