Linux线程(1)--线程概念

线程

在这先解释下进程,进程是一个执行的实体,包括其需要执行的程序,以及其活动过程是一个动态的过程,可以讲进程是一个“执行中的程序”,从操作系统角度进程是资源分配和一个独立单位,操作系统在分配CPU、内存、时间片等资源时是以进程为基本单位的。
在Linux下没有真正的用户线程,真正的用户线程是建立在用户空间,其对内核是透明的,因此其所属进程单独参与处理器的竞争,而进程的所有线程参与竞争该进程的资源。Linux下的用户线程通过进程的PCB和其相关资源模拟线程,Linux下的线程采用线程-进程"一对一"模型(即一个用户线程对应一个LWP)借此来实现内核对线程的调度(轻量级进程(LWP)将用户线程调度到内核线程上的内核机制,其运行在用户空间中调度由内核完成,和该用户空间中的其他进程共享资源)。Linux下的线程在创建时创建一个PCB将其绑定到进程的资源上和进程中的其他线程共享进程的资源,此时可以将进程称为线程组,进程由一个主线程和多个进程组成,线程的PID为主线程的PID即在linux下通过ps -aL查看的LWP的值,即linux下进程是资源分配的基本单位,线程是进行调度的基本单位。
在这里插入图片描述
另外线程拥有一些独立的资源,如记录执行上下文的一些寄存器(包括程序计数器),线程栈,线程ID(用户线程库的操作),LWP(用与CPU调度),优先级等程序调度所需的统计信息。

线程的优缺点

线程具有以下优点:
1.创建线程和销毁需要花费的代价小于进程
2.线程调度需要操作系统做的工作少,线程切换上下文花费较少
3.线程占用的资源少,
4.能充分利用多处理器的可并行数量
5.当在阻塞等待时(如等待I/O操作)可以进行其他计算任务, 另外线程也可以同时等待多个I/O任务
线程的缺点:
线程缺乏访问控制, 进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响
线程编写难度提高:编写与调试一个多线程序比单线程序困难
线程之间缺乏保护,因此在编写程序中需要对其同步与互斥关系慎重考率

线程的基本控制

线程的操作可以通过pthread提供的库函数实现,在链接时需要添加 -lpthread

线程创建

函数原形 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
函数功能:创建一个线程
函数参数:thread 线程标识符地址,attr 线程属性地址, start_routine线程需要执行的函数指针也就是入口地址,arg 函数的参数
返回值:成功返回0,失败返回错误码
pthread_create函数会产生一个线程标识符,存放在第一个参数提供的地址中,其类型为pthread_t,它和线程ID不同,线程ID指的是LWP的值,即CPU在进行调度时所使用的ID,这个标识符是线程库NPTL创建,是用于线程库的后续操作,并且其提供了一个pthread_self函数来获取这个标识符。下面函数的id均为此id

线程终止

线程终止的方式有三种
线程中return (主线程return会终止整个进程,会调用exit), 线程中调用pthread_exit函数终止, 一个线程可以调用pthread_ cancel终止同一进程中的另一个线程。
函数原型 void pthread_exit(void *retval);
参数retval 不能是线程的私有数据,在线程结束后其私有数据会释放。
函数原型int pthread_cancel(pthread_t thread);
函数功能:取消一个正在执行的线程
函数参数:线程id
返回值:成功返回0,失败返回-1

线程等待

函数原型:int pthread_join(pthread_t thread, void **retval);
函数功能:等待线程并回收资源
返回值:0成功,失败返回i错误码
参数:thread 线程id,retval指向线程的返回值
线程通过不同的方式终止,pthrad_join获得的值是不同的,三种退出方式分别有不同的值
线程中使用return返回,retval指向的是线程函数的返回值
线程中通过pthread_exit函数终止,retval指向传入pthread_exit函数的参数
线程被其他线程通过pthread_cancel终止,retval指向单元里面的值是一个常数PTHREAD_ CANCELED
线程在调用pthread_join时会阻塞直到thread线程终止,
线程等待主要是为了获得线程的返回值,一般如果不关心线程的返回值,可以将线程分离,将线程分离就可以不用等待,线程结束后会自动退出释放资源。

线程分离

函数原型:int pthread_detach(pthread_t thread);
函数参数:需要分离的线程id, 可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离,
返回值:成功 0 失败返回错误码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值