线程

线程

pthread_create() pthread_exit()

创建了线程之后,地址空间不变化,但是内核态增加了一个pcb,原进程变为主进程,创建出的为子进程。两线程共享地址空间,有各自独立的pcb,子线程的pcb是拷贝的主线程的
用户区:

  • .text //代码段
  • .bss //未初始化的全局变量
  • .data //初始化的全局变量
  • 动态库加载区
  • 环境变量
  • 命令行参数

用户区只有栈是不共享的,栈是平均分配
通信:

  • 全局变量,堆

Linux中:
线程就是轻量级的进程
对于内核来说,线程就是进程

相关概念:
线程号:线程号给内核看,查看方式ps -Lf pid,pid为进程号
线程ID:不同于线程号

一个单独的进程可以看成一个线程

多线程和多进程的区别:

  • 多进程(父子):
    – 共享的资源:代码,文件描述符,内存映射区
  • 多线程:
    – 共享的资源:堆,全局变量
    – 节省资源
    主线程退出,子线程立即结束

函数原型:

int pthread_create(
	pthread_t *thread,//线程ID,无符号长整形,传出的参数
	const pthread_attr_t *attr,//线程属性,NULL,分离,设置分离可以自己释放自己的pcb
	void *(*start_routine)(void *),//线程处理函数
	void *arg//线程处理函数参数
);

函数描述:创建线程
线程属性:
*
返回值:成功返回0,错误返回错误号,不能使用perror打印错误


函数原型:void pthread_exit(void *retval);
函数功能:单个线程退出(可以退出主线程)
函数参数:传出退出信息,必须指向全局
返回值:空

– 使用exit()会使得两个线程同时退出,return也行


函数原型:int pthread_join(pthread_t thread, void **retval);
函数功能:阻塞等待子线程的退出,获取线程退出状态
函数参数:要回收的线程ID 读取线程退出状态(传一级指针的地址)
指向的地址和pthread_exit()参数指向的地址是一样的


函数原型:int pthread_detach(pthread_t thread);
函数功能:线程分离–子线程可以自己回收pcb(也可以在创建的时候指定)


函数原型:int pthread_cancel(pthread_t thread)
函数功能:杀死(取消)线程,必须做过一次系统调用(调用系统函数)
pthread_testcancel:设置取消点


函数原型

int pthread_equal(pthread_t t1, pthread_t t2);//预留函数,基本不用

通过属性设置线程分离:
1.线程属性类型:pthread_attr_t attr;
2.线程属性操作函数:

  • 对线程属性变量的初始化
    • int pthread_attr_init(pthread_attr_t* attr);
  • 设置线程分离属性
    • int pthread_attr_setdetachstate(
      pthread_attr_t *attr,
      int detachstate
      );
    • 参数:
      • attr:线程属性
      • detachstate:
        • PTHREAD_CRAETE_DETACHED(分离)
        • PTHREAD_CREATE_JOINABLE(非分离)
  • 释放线程资源函数
    • int pthread_attr_destroy(pthread_attr_t *attr);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值