LinuxThreads 项目最初将多线程的概念引入了 Linux?,但是 LinuxThreads 并不遵守 POSIX 线程标准。 让我们来回顾一下 LinuxThreads 设计细节的一些基本理念: LinuxThreads 非常出名的一个特性就是管理线程(manager thread)。 与 LinuxThreads 相比,它在性能和稳定性方面都提供了重大的改进。与 LinuxThreads 一样,NPTL 也实现了一对一的模型。 结束语 LinuxThreads 的限制已经在 NPTL 以及 LinuxThreads 后期的一些版本中得到了克服。 最后,也许是最重要的事情,请记住 LinuxThreads 项目的创建者已经不再积极更新它了,他们认为 NPTL 会取代 LinuxThreads。
ptfork.c实现了pthread_atfork函数,该函数的作用见pthread_atfork(3) - Linux manual page和源码中的pthread_atfork.man文件。
线程屏障是线程同步的一个方式。线程执行完一个操作后,可能需要等待其他线程也完成某个动作,这时候,当前该线程就会被挂起,直到其他线程也完成了某个操作,最后所有线程被唤醒。屏障主要有三个函数。
下面通过linuxthreads的代码看看线程的栈。linuxthreads里有一个__pthread_initialize函数,该函数会在main函数执行前执行。在该函数中会设置主线程的栈范围。 pthread_t得到tcb return (pthread_t) (((unsigned long int) sp | (STACK_SIZE - 1)) + 1) - 1; #endif } 这就是linuxthreads
/* Semaphores a la POSIX 1003.1b */ #include "pthread.h" #include "semaphore.h" #include "internals.h" #include "restart.h" #ifndef HAS_COMPARE_AND_SWAP /* If we have no atomic compare and swap, fake it using an extra spinlock. */ #include "spinlock.h
条件变量是线程间同步的一种机制,本文分析条件变量的实现和使用。我们先看一下条件变量的定义。
该文件是线程私有数据的实现。在线程tcb里有一个数组,保存了一系列的键对值。从而实现了线程的私有数据存储。线程想拥有自己的数据时,首先获取一个键,然后在tcb中保存一个键对值即可。
join.c文件一共有三个函数,下面我们一个个看一下。 1 pthread_exit // 线程退出 void pthread_exit(void * retval) { // 获取当前线程的结构
因为linuxthreads是通过创建一个进程的方式实现线程的,所以属性中支持设置调度的优先级,调度策略等(参考操作系统的实现)。该文件没有太多内容。具体作用在分析其他文件的时候再作分析。
cancel.c实现了线程的是否可取消,取消类型,取消线程,设置线程退出时需要执行的函数列表等功能。 /* Thread cancellation */ #include <errno.h> #include "pthread.h" #include "internals.h" #include "restart.h" /* 修改线程的可取消属性。有一个取消点 取消状态分为可取消,不可取消 不可取消的时候,收到取消信号,忽略 可取消的时候,收到取消信号的时候,根据取消类型做处理。
/* Linuxthreads - a simple clone()-based implementation of Posix */ /* threads for Linux.
的lib. linuxthreads利用前面提到的轻量级进程来实现线程, 但是对于POSIX提出的那些要求,linuxthreads除了第5点以外, 都没有实现(实际上是无能为力): 1.如果运行了A程序 或许这也是为什么linuxthreads虽然与POSIX的要求差距甚远, 却能够存在, 并且还被使用了好几年的原因吧~ 但是, linuxthreads为了实现这个”第5点”, 还是付出了很多代价, 并且创造了 linuxthreads本身的一大性能瓶颈. 因为linuxthreads自动创建了一个管理线程. 上面提到的”第5点”就是靠管理线程来实现的. 可见,线程的创建与销毁都是通过管理线程来完成的, 于是管理线程就成了linuxthreads的一个性能瓶颈.
其中比较典型的就是LinuxThreads,其作者是Xavier.Leroy,这玩意我是没用过,我也是从一些小黄书中寻得其一些蛛丝马迹。 (注PS:由于LinuxThreads是满足了部分POSIX-Threads标准的,所以这东西在BSD上也是可以用的) 总之就是不好,憋问太多,问就是薛定谔的线程。 在LinuxThreads不久之后,就先后有两个大型公司先后参与了线程实现的研发,一则是来自于IBM的NGPT工程,另一个是来自于RedHat的NPTL工程,这两家公司刚开始都是打着提升LinuxThreads 总结一句话:Pthread是标准,而无论是LinuxThreads还是NGPT还是NPTL这都是具体的实现,总之就是标准与实现的故事。 LinuxThread:https://web.archive.org/web/19961128030318/http://pauillac.inria.fr/~xleroy/linuxthreads/
(具体可参考http://www.man7.org/linux/man-pages/man2/clone.2.html) manager线程是linuxthreads线程库比较重要的存在,他是管理其他线程的线程
以下是广泛使用的线程库: LinuxThreads LinuxThreads自从Linux内核2.0起就已经被作为默认的线程实现。LinuxThreads的一些实现并不符合POSIX标准。 Native POSIX Thread Library(NPTL)正在取代LinuxThreads。LinuxThreads在将来的Linux企业发行版中将不被支持。 通过Linux内核2.6的高级特性,例如,新的clone()系统调用、信号处理的实现等等,它具有比LinuxThreads更高的性能和伸缩性。 NPTL与LinuxThreads有一些不兼容。 一个依赖于LinuxThreads的应用可能不能在NPTL实现中工作。 Next Generation POSIX Thread(NGPT) NGPT是一个IBM开发的POSIX线程库。
以下是广泛使用的线程库: LinuxThreads LinuxThreads自从Linux内核2.0起就已经被作为默认的线程实现。LinuxThreads的一些实现并不符合POSIX标准。 Native POSIX Thread Library(NPTL)正在取代LinuxThreads。LinuxThreads在将来的Linux企业发行版中将不被支持。 通过Linux内核2.6的高级特性,例如,新的clone()系统调用、信号处理的实现等等,它具有比LinuxThreads更高的性能和伸缩性。 NPTL与LinuxThreads有一些不兼容。 一个依赖于LinuxThreads的应用可能不能在NPTL实现中工作。 Next Generation POSIX Thread(NGPT) NGPT是一个IBM开发的POSIX线程库。
以下是广泛使用的线程库: LinuxThreads LinuxThreads自从Linux内核2.0起就已经被作为默认的线程实现。LinuxThreads的一些实现并不符合POSIX标准。 Native POSIX Thread Library(NPTL)正在取代LinuxThreads。LinuxThreads在将来的Linux企业发行版中将不被支持。 通过Linux内核2.6的高级特性,例如,新的clone()系统调用、信号处理的实现等等,它具有比LinuxThreads更高的性能和伸缩性。 NPTL与LinuxThreads有一些不兼容。 一个依赖于LinuxThreads的应用可能不能在NPTL实现中工作。 Next Generation POSIX Thread(NGPT) NGPT是一个IBM开发的POSIX线程库。
flex sudo apt-get install flex 下载glibc wget http://ftp.gnu.org/gnu/glibc/glibc-2.3.2.tar.gz 下载glibc-linuxthreads wget http://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.3.2.tar.gz 解压 tar -zxvf glibc-2.3.2.tar.gz cd /glibc-linuxthreads-2.3.2.tar.gz cd .. . enable-add-ons --libexecdir=/usr/lib --with-headers=/usr/include make make install 注意点: 1、要将glibc-linuxthreads
LinuxThreads计划使用这个系统调用来提供一个内核级的线程支持。但是这个解决方法与真正的POSIX标准有一些不兼容的地方,尤其是在信号处理、进程调度和进程间同步原语方面。 有两家公司参与了对LinuxThreads的改进(向他们致敬):IBM启动的NGTP(Next Generation POSIX Threads)项目,以及红帽Redhat公司的NPTL(Native
Final linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX 这个限制可以在 /usr/include/bits/local_lim.h 中查看 对 linuxthreads = 0) return; i ++; printf(“i = %d\n”, i); } } 试验显示,在 linuxthreads 上最多可以创建 381 个线程,之后就会返回 EAGAIN 在 nptl 那为什么 linuxthreads 上还要少一个线程呢? 这可太对了,因为 linuxthreads 还需要一个管理线程 http://www.cnblogs.com/roucheng/ 为了突破内存的限制,可以有两种方法 1) 用 ulimit -s 1024