线程的创建、等待与终止

LWP:轻量级进程,因为Linux下的线程是用进程模拟的,所以它比线程大一点,比进程小一点
Linux上线程函数位于 libpthread共享库中 ,因此在 编译时要加上 -lpthread选项
************************************************************************************************************************************************************************************************************************
一、创建线程:
thread->线程 id   attr->线程属性(可分离,可结合(默认))    start_routine->创建的线程的执行流(即线程对应的函数)   arg->执行流的参数
返回值 : 成功返回 0, 失败返回错误号。
以前学过的系统函数都是成功返回 0, 失败返回 -1, 而错误 号保存在全局量 errno 中。
pthread 库的函数都是通过返回值返回错误号 , 虽然每个线程也都 有一个 errno, 但这是为了兼容其它函数接口而提供的 ,pthread 库本身并不使用它 , 通过返回值 返回错误码更加清晰。
在一个线程中调用 pthread_create()创建新的线程后,当前线程从 pthread_create()返回继续往下执行
start_routine返回时, 这个线程就退出了 ,其它线程可以调pthread_joinstart_routine 的返回值,类似于父进程调用 wait(2)得到子进程的退出 状态
等待进程的作用:1、避免僵尸进程;
                                2、读取子进程的退出结果
                                3、同步父子进程的执行流
************************************************************************************************************************************************************************************************************************
、获取线程 id        
 
  该函数是获取线程自己的 id ,功能相当于进程中的 getpid.
调用此函数获得的各个线程的 id 是不同的,但对于同一进程中的线程来说,它们的进程号都与创建它们的进程的 p id 相同.
************************************************************************************************************************************************************************************************************************
、只终止线程而不终止进程的三种方法
(1)从要终止的线程函数中 return ,但从主线程 return 相当于终止整个进程
(2)从线程自己内部调用函数 pthread_exit来终止自己:
        
           retval->线程的退出码
          retval void * 类型 , 和线程函数返回值的用法一样 , 其它线程可以调用 pthread_join 获得这个指 针。
(3)一个线程可以调用函数 pthread_cancel 终止同一进程中的另一个线程:
       
           thread->要取消的线程的 id
          用该函数终止线程时,线程的退出码是 -1,它是一个宏 ,PTHREAD_CANCELED
        查看宏的指令:#grep  -R  PTHREAD_CANCELED  /usr/include/
注意  pthread_exit  或者 return  返回的指针所指向的内存单元必须是 全局的或者是用 malloc分 配的 , 不能在线程函数的栈上分配 , 因为当其它线程得到这个返回指针时线程函数已 经退出了。
************************************************************************************************************************************************************************************************************************
 、 线程等待
 
thread ->被等的那个线程的id                 retval->通过它得到线程的退出码
调用该函数的线程将挂起等待 , 直到 id thread 的线程终止。 thread 线程以不同的方法终止 , pthread_join 得到的终止状态是不同的 , 总结如下 :
1. 如果 thread 线程 通过 return 返回 ,value_ptr 所指向的单元里存放的是 thread 线程函数的返 回值
2. 如果 thread 线程被别的线程调用 pthread_cancel 异常终掉 ,value_ptr 所指向的单元里存放 的是常数 PTHREAD_CANCELED
3. 如果 thread 线程是 自己调用 pthread_exit 终止 ,value_ptr 所指向的单元存放的是 传给 pthread_exit 的参数 。 如果对 thread 线程的终止状态不感兴趣 , 可以传 NULL value_ptr 数。

一般情况下 , 线程终止后 , 其终止状态一直保留到其它线程调用 pthread_join 获取它的状态为 止。 但是线程也可以被置为 detach 状态 , 这样的线程一旦终止就立刻回收它占用的所有资源 ,
而不保留终止状态。
不能对同一线程调用两次 pthread_join, 或者如果已经对一个线程调 用 了 pthread_detach 就不能再调用 pthread_join 了。

************************************************************************************************************************************************************************************************************************
五、终止进程的方法 
(1)从 main 函数 return
(2)从任意地方调用 exit(退出码)
************************************************************************************************************************************************************************************************************************
六、上述函数的使用例子
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值