Pthreads系统中建立线程的主要方式是调用pthread_create,如果进程的信号通知机制设为SIGEV_THREAD,则当进程收到一个POSIX信号时也会创建线程。其它的创建方式也根据系统而不同。
有关新线程建立后,处于就绪状态,受调度机制的限制,新线程可能需要停留一段时间后才被执行。 而且调用pthread_create创建线程返回和新线程的执行函数这两个不存在同步的关系(即两个不需要依赖谁),有可能新线程在pthread_create返回之前就已经运行了,更或者在返回之前就已经运行完毕了。
在大多数系统中,初始线程(main)运行在默认进程 堆栈上,这个堆栈可以增长到足够的尺寸,而在某些实现中,普通线程的堆栈空间是受限的。
线程库实际上由两部分组成:内核的线程支持+用户态的库支持(glibc),Linux在早期内核不支持线程的时候glibc就在库中(用户态)以线程(就是用户态线程)的方式支持多线程了,POSIX thread只要求了用户编程的调用接口对内核接口没有要求。linux上的线程实现就是在内核支持的基础上以POSIX thread的方式对外封装了接口,所以才会有两个ID的问题。
gettid是内核中的线程的ID, pthread_self是POSIX thread ID
由于在Linux下POSIX thread 和系统thread是一对一的模型,所以可以认为一个gettid必然对应一个pthread id,但没有什么方法直接实现对两者的对应转换。
线程主要包含了如下属性:
scope作用域, 栈大小stack size,栈地址stack address,优先级 priority, 分离的状态detach state,调度策略和参数。
阅读(1167) | 评论(0) | 转发(0) |