Linux系统编程---线程概念
来源:互联网 发布:ps软件源码下载 编辑:程序博客网 时间:2024/05/18 10:25
1.建立线程
对于线程的操作都是通过pthread_t类型的线程ID来实现的。
创建线程
int pthread_create(pthread_t * thread, const pthread_attr_t *attr,
void *(*start)(void *), void *arg)
thread返回创建的线程的ID
attr用于设置线程的属性,一般设置为NULL,即使用默认属性
线程起始则是通过第三个函数指针来指示,函数的参数为void *,返回值为void *
arg可以为线程传递参数
当前线程调用pthread_create和新的线程被执行不存在同步关系,也就是说新线程在pthread_create未返回前可能已经运行甚至结束。
main函数可以看做是一种特殊的线程,一般称为主线程或者初始线程。
初始线程与普通线程的区别
1.接收的参数是不同的,初始线程为(int argc,char *argv[]),而普通线程为(void *)
2.初始线程继承UNIX进程的特性,从初始线程返回时,同时会终止所有其他线程,而普通线程不会影响其他线程。
3.初始线程一般使用的进程的堆栈,一般是可增长的足够尺寸,普通线程的堆栈一般是有限制的,可能会导致栈溢出。
main函数作为特殊的线程也可以使用pthread_cancle,pthread_join等函数,若希望初始线程退出时,其他线程继续运行,可以通过调用pthread_exit()函数。
2.线程的取消
int pthread_cancle(pthread_t thread)
3.线程的链接
int pthread_join(pthread_t thread, void **value_ptr)
4.线程的分离
int pthread_detach(pthread_t thread)
5.线程的退出
void pthread_exit(void *value_ptr)
以上返回值
0:成功
其他:错误编号
6.线程的四种基本状态
就绪状态
运行状态
阻塞状态
- 试图加锁一个已经被锁住的互斥量
- 等待某个条件变量
- 调用singwait等待某个尚未发生的信号
- 执行无法立即完成的读写操作
- 由于系统内存页出错的问题而阻塞
终止状态
- 线程从启动函数返回
- 线程调用phtread_exit函数
- 线程自身调用pthread_cancle函数或者其他线程调用pthread_cancle函数
从启动函数或者pthread_exit函数返回与调用pthread_cancle外部区别在于,pthread_cancle返回值为PHTREAD_CANCLED
调用pthread_cancle和pthread_exit函数到终止状态前,线程会调用清理函数做些清理,清理过程通过pthread_cleanup_push注册,pthread_cleanup_pop删除。
线程的取消(终止线程)
7.线程的回收
线程达到终止状态时,有些资源不会被回收,例如线程的返回值,线程ID等
分离不会影响正在运行的线程,只是通知操作系统在线程结束时,可以回收线程资源。
一种比较特殊的是进程直接退出,例如main函数退出
线程分离属性,可以通过以下方式实现,
- 创建线程时指定线程属性为可分离
- 调用phtread_detach函数
- 调用pthread_join函数
线程到达终止状态时并且为可分离时,系统会立即回收线程资源,如线程堆栈,保存寄存器的和返回值的内存空间等。
否则线程会一直处于终止状态到被分离的状态。
0 0
- Linux系统编程---线程概念
- Linux线程编程 - 线程概念及创建线程
- 【Linux系统编程】线程池
- linux系统编程之主要概念
- Linux系统编程3.时间概念
- Linux/Unix系统编程手册二:系统编程概念
- Linux系统编程第14章-系统编程概念
- 【Linux系统编程】Linux 线程浅析
- Linux系统编程学习之《线程》
- Linux系统编程---线程同步---互斥量
- Linux系统编程---线程同步---条件变量
- Linux系统编程——线程池
- linux系统编程:线程原语
- linux系统编程:线程同步-互斥量(mutex)
- linux系统编程:线程同步-信号量(semaphore)
- Linux系统编程--线程控制(一)
- Linux系统编程--线程控制(二)
- 【Linux系统编程】线程的基本操作
- GitHub使用教程
- 一个http请求的详细过程
- 2014-03-30工作日志:我的编程风格
- 在Ubuntu上安装JDK6
- js获取至今天一个月的时间
- Linux系统编程---线程概念
- 一个简单的序列化实现
- 1004/找出现最多的字符串
- 在64位机器中编译出错No architectures to compile for (ONLY_ACTIVE_ARCH...解决方法
- java后台hibernate代码这里的双引号应该怎样理解?
- ubuntu下java环境变量配置 (window上也差不多).
- 数值的整数次方
- WIN7无法打开CHM解决办法
- 思维导图:大脑使用说明书----读后