Linux 2.6 版本后多线程的变化

前段时间看了下APUE关于多线程的部分,讲Linux的多线程是通过clone的系统调用实现的,针对这点进行验证发现并非如此,确切说是版本大于2.6的是这样的。

#include <pthread.h>
#include <stdio.h>

void prid(const char *name)
{
        pid_t pid;
        pthread_t tid;

        pid = getpid ();
        tid = pthread_self ();
        printf ("%s: pid = %u, tid = 0x%x\n", name, (unsigned int)pid, (unsigned int)tid);
}
void *foo (void *args)
{
        prid ("new thread");
        pthread_exit ((void *)0);
}

int main(int argc, char const *argv[])
{
        pthread_t tid;
        int err;
        void *ret;
        err = pthread_create (&tid, NULL, foo, NULL);
        if (err != 0)
        {
                printf ("create thread error\n");
        }
        prid ("main thread");
        pthread_join (tid, &ret);
        return 0;
}

编译:

gcc thread.c -lpthread

运行 ./a.out,结果:

main thread: pid = 5714, tid = 0xe7ae4740
new thread: pid = 5714, tid = 0xe72f4700

可以看见主线程和新创建线程在调用getpid()获取的进程号是一样的,也就是说并非是通过clone实现的。在查找答案的时候发现有网友说是缓存造成的,我只能说想象力很丰富。答案是Linux 2.6 后使用的是Native POSIX Thread Library(NPTL)库,取代了LinuxThreads库,使得Linux下的线程是一种更像线程的线程。

详细的区别请看链接http://www.ibm.com/developerworks/cn/linux/l-threading.html

APUE第三版已经已经没这个问题了。我想知道第三版的修改了哪些东西,于是按书上给的邮件地址[email protected]发了封邮件。

回复:

I summarized the changes in the preface.

Steve

Jobs? It‘s a cold joke!

所以我决定把第三版的前言贴一下,当然其中提到了NPTL。

Changes from the Second Edition

One of the biggest changes to the Single UNIX Specification in POSIX.1-2008 is the demotion of the STREAMS-related interfaces to obsolescent status. This is the first step before these interfaces are removed entirely in a future version of the standard. Because of this, I have reluctantly removed the STREAMS content from this edition of the book. This is an unfortunate change, because the STREAMS interfaces provided a nice contrast to the socket interfaces, and in many ways were more flexible. Admittedly, I am not entirely unbiased when it comes to the STREAMS mechanism, but there is no debating the reduced role it is playing in current systems:

Linux doesn’t include STREAMS in its base system, although packages (LiS and OpenSS7)are available to add this functionality.

Although Solaris 10 includes STREAMS, Solaris 11uses a socket implementation that is not built on top of STREAMS.

Mac OS X doesn’t include support for STREAMS.

FreeBSD doesn’t include support for STREAMS (and never did).

So with the removal of the STREAMS-related material, an opportunity exists to replace it with new topics, such as POSIX asynchronous I/O.

In the second edition, the Linux version covered was based on the 2.4 version of the source. In this edition, I have updated the version of Linux to 3.2. One of the largest area of differences between these two versions is the threads subsystem. Between Linux 2.4 and Linux 2.6, the threads implementation was changed to the Native POSIX Thread Library (NPTL).NPTL makes threads on Linux behave more like threads on the other systems.

In  total,  this  edition  includes  more than  70  new  interfaces,  including  interfaces  to handle asynchronous I/O, spin locks, barriers, and POSIX semaphores.  Most obsolete interfaces are removed, except for a few ubiquitous ones.

希望对大家有用!

时间: 2024-11-05 19:31:28

Linux 2.6 版本后多线程的变化的相关文章

Linux下用Intel编译器编译安装NetCDF-Fortan库(4.2版本后)

本来这个问题真的没必要写的,可是真的困扰我太久%>_<%,决定还是记录一下. 首先,最权威清晰的安装文档还是官方的: Building the NetCDF-4.2 and later Fortran libraries (写此文时,最近版为4.2) 那这个文档最开始就告诉我们,自NetCDF库4.2版本以后,Fortran的库和C的库就要分开build啦!而且要装Fortran的库必须先装好C的库. 所以先装C的库咯:仍然官方文档: Getting and Building NetCDF-C

宝塔linux面板 切换PHP版本后,网站访问报错503 Service Unavailable解决

切换PHP版本后,网站访问报错503 503 Service Unavailable Service Unavailable The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later. 1.检查网站对应的php版本进程是否已经启动.(这里检测可以在宝塔里正常查看phpinfo的信息即视为正常启动了

嵌入式 Linux进程间通信(十一)——多线程简介

嵌入式 Linux进程间通信(十一)--多线程简介 一.线程简介 线程有四种:内核线程.轻量级进程.用户线程.加强版用户线程 1.内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间.支持多线程的内核叫做多线程内核(Multi-Threads kernel ). 2.轻量级进程LWP 轻量级进程(LWP)是一种由内核支持的用户线程,是基于内核线程的高级抽象,只有先支持内核线程,才能有轻量级进程LWP.每一个

QT OpenGL中文教程在QT4版本后的错误代码更改(一)

由于教程中说的已经够可以了,这里就不对代码进行分析了,有兴趣可以自己去看看.这个教程来源于原来的NeHeOpenGL中文教程 (http://www.yakergong.net/nehe/) ,但其有不好的地方,就是我去看的时候,根本就下载不了代码~~~~可能我人品比较差吧.可以作为参考看一下. 所以选择了下面这个教程: 教程地址:QT OpenGL中文教程(http://www.qiliang.net/old/nehe_qt/index.html) 正在学习这个教程,但发现其时间过久: 根据Q

Linux中查看进程的多线程pstree, ps -L

Linux中查看进程的多线程 在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:在我的系统中,用qemu-system-x86_64命令启动了一个SMP的Guest,所以有几个qemu的线程,以此为例来说明. 1. pstree 命令,查看进程和线程的树形结构关系.  BASH 1 2 3 4 5 [root@jay-linux ~]# pstree | grep qemu |-gn

计算机的组成和Linux的发行版本介绍

计算机的组成和 Linux的发行版本介绍 计算机的组成及功能 计算机的五大组成,如下; 各部分的作用; 控制单元和算数逻辑单元是CPU的两个主要组成部分 控制单元主要协调各组件与各单元间的工作 算数逻辑单元主要负责程序运算与逻辑判断 内存,DRANM(Dynamic Random Access Memory)动态随机访问内存:CPU读取的数据都是从内存读取来的. 输入单元,下指令,提供数据的输入等:如:键盘.鼠标等 输出单元,输出数据加工后的结果:如:显示器等 CPU读取的数据都是从内存中获取,

Kali Linux 装好系统后安装常用软件

1.配置软件源 leafpad /etc/apt/source.list or(recommand): #官方源 deb http://http.kali.org/kali kali main non-free contrib deb-src http://http.kali.org/kali kali main non-free contrib deb http://security.kali.org/kali-security kali/updates main contrib non-fr

Linux主要发行版本介绍

Linux主要发行版本介绍 1.Red Hat Linux Red Hat是一个比较成熟的Linux版本,无论在销售还是装机量上都比较可观.该版本从4.0开始同时支持Intel.Alpha及Sparc硬件平台,并 且通过Red Hat公司的开发使得用户可以轻松地进行软件升级,彻底卸载应用软件和系统部件.Red Hat最早由Bob Young和Marc Ewing在1995年创建,目前分为两个系列,即由Red Hat公司提供收费技术支持和更新的Red Hat Enterprise Linux,以及

Elasticsearch升级至1.x后API的变化-三

请支持原创:http://www.cnblogs.com/donlianli/p/3841762.html 1.索引格式 1.x之前的版本,被索引的文档type会同时出现在url和传输的数据格式中,如下: PUT /my_index/my_type/1{  "my_type": {     ... doc fields ...  }} 这种方式不太妥,如果一个document,本身也有my_type域,那么就会有歧义.1.x版本如果碰到上面的命令,会把my_type当成一个docume