Linux系统编程---线程概念

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函数
线程到达终止状态时并且为可分离时,系统会立即回收线程资源,如线程堆栈,保存寄存器的和返回值的内存空间等。
否则线程会一直处于终止状态到被分离的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值