Linux编程--线程

目录

线程和进程的比较

 线程的特点

线程的创建 

线程的结束

线程的查看

线程的回收

线程的分离

线程分离和回收时用原则

线程的取消

线程的清理


线程和进程的比较

 

 线程的特点

线程的创建 

#include<pthread.h>

int pthread_create(pthread_t *thread, constpthread_attr_t *attr,

void *(*routine)(void *), void *arg);

成功返回0,失败时返回错误码

thread 线程对象

attr 线程属性,NULL代表默认属性

routine 线程执行的函数

arg 传递给routine的参数 ,参数是void *,注意传递参数格式

线程的结束

#include  <pthread.h>

void  pthread_exit(void *retval);

结束当前线程

retval可被其他线程通过pthread_join获取

线程私有资源被释放

线程的查看

#include <pthread.h>

pthread_t pthread_self(void);

线程的回收

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval);

注意:pthread_join 是阻塞函数,如果回收的线程没有结束,则一直等待

线程的分离

#include <pthread.h>

int pthread_detach(pthread_t thread)

创建线程时候设置为分离属性

  pthread_attr_t attr;

  pthread_attr_init(&attr);

  pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

线程分离和回收时用原则

pthread_join():

创建线程默认的属性就是joinable的,此时需要pthread_create与pthread_join配合使用;

线程创建者通过pthread_join获取线程函数返回值,释放资源等。

pthread_detach():

使用该函数可以将子线程与主线程分离,子线程结束后,自己回收自己的资源,而不需要主线程回收资源

线程的取消

意义:随时杀掉一个线程

int pthread_cancel(pthread_t thread);

注意:线程的取消要有取消点才可以,不是说取消就取消,线程的取消点主要是阻塞的系统调用。

如果没有取消点,手动设置一个

void pthread_testcancel(void);

设置取消使能或禁止

int pthread_setcancelstate(int state, int *oldstate);

PTHREAD_CANCEL_ENABLE

PTHREAD_CANCEL_DISABLE

设置取消类型

int pthread_setcanceltype(int type, int *oldtype);

PTHREAD_CANCEL_DEFERRED等到取消点才取消

PTHREAD_CANCEL_ASYNCHRONOUS目标线程会立即取消

线程的清理

必要性:当线程非正常终止,需要清理一些资源。

void pthread_cleanup_push(void (*routine) (void *), void *arg)
void pthread_cleanup_pop(int execute)

routine函数被执行的条件:

1.被pthread_cancel取消掉。

2.执行pthread_exit

3.非0参数执行pthread_cleanup_pop()

注意:

1.必须成对使用,即使pthread_cleanup_pop不会被执行到也必须写上,否则编译错误。

2.pthread_cleanup_pop()被执行且参数为0,pthread_cleanup_push回调函数routine不会被执行.

3 pthread_cleanup_push和pthread_cleanup_pop可以写多对,routine执行顺序正好相反。

4.线程内的return可以结束线程,也可以给pthread_join返回值,但不能触发pthread_cleanup_push里面的回调函数,所以我们结束线程尽量使用pthread_exit退出线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值