您的位置:首页 > 运维架构 > Linux

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函数

线程到达终止状态时并且为可分离时,系统会立即回收线程资源,如线程堆栈,保存寄存器的和返回值的内存空间等。
否则线程会一直处于终止状态到被分离的状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: