Chinaunix首页 | 论坛 | 博客
  • 博客访问: 824414
  • 博文数量: 157
  • 博客积分: 542
  • 博客等级: 中士
  • 技术积分: 1696
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-21 20:21
文章分类
文章存档

2017年(1)

2016年(2)

2015年(6)

2014年(42)

2013年(77)

2012年(19)

2011年(10)

分类: C/C++

2013-09-04 17:31:12

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,调度策略和参数。
                                                 
阅读(1128) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~