Linux系统编程---线程概念
2014-03-30 21:28
260 查看
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函数
线程到达终止状态时并且为可分离时,系统会立即回收线程资源,如线程堆栈,保存寄存器的和返回值的内存空间等。
否则线程会一直处于终止状态到被分离的状态。
对于线程的操作都是通过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函数
线程到达终止状态时并且为可分离时,系统会立即回收线程资源,如线程堆栈,保存寄存器的和返回值的内存空间等。
否则线程会一直处于终止状态到被分离的状态。
相关文章推荐
- Linux----快速注释包含特定字符串的行
- Linux系统编程---IO操作
- linux cramfs只读文件系统添加一个写文件夹
- Linux - epoll 模型【未完】
- linux搭建本地局域网yum源
- mysql在linux下的my.cnf文件在哪里!
- linux x86_64 下安装glibc的问题
- 在Linux下编译安装MySQL5.6.10
- CentOS Linux防火墙配置及关闭
- LSA-读书笔记
- LinuxTools---Rsync---原理及其应用(二) 推荐
- LSA-linux指令集
- Linux 自学笔记——忘记 root 用户 和 普通用户 登录密码
- linux下多线程编程问题收集
- 将web项目部署到linux虚拟机上(一)
- LinuxTools---Rsync---原理及其应用(一)
- CentOS6.5配置DNS
- 每天一个linux命令(39):telnet命令
- linux 图形的一些基本概念
- linux用sed在文件最前面插入一行