Linux线程

1.Linux线程

如果说在操作系统中引入进程是为了使多个程序可以并发执行,以提高资源利用率和系统吞吐量,那么在操作系统中引入线程则是为了减少程序哎并发执行时所付出的时空开销,使OS具有更好的并发性。

1.1进程回顾

  • 进程是一个可以拥有资源的独立单位,它所拥有的资源包括用于存放程序的磁盘和内存地址空间以及它在运行时所需要的IO设备、已经打开的文件、信号量等。
  • 传统OS中,进程也是一个可独立调度和分派的基本单位,每个进程在系统中有唯一的PCB,系统可以根据PCB感知进程的存在,咋利用PCB中的信息来恢复进程运行的现场。

以上两个进程的基本属性使进程成为一个能独立运行的基本单位,也就构成了程序并发执行的基础。

1.2程序并发的时空开销

  • 1.创建进程:系统创建进程时为其分配其需要的资源。
  • 2.撤销进程:系统撤销进程时回收其所占资源和PCB。
  • 3.进程切换:切换进程时系统会保留当前进程CPU环境,为新进程设置CPU环境。

进程技术的劣势就是进程间切换开销大,进程间通信麻烦而且效率低

1.3线程的的特点

与进程(process)类似,线程(thread)是允许程序并发执行多个任务的一种机制。一个进程可以包含多个线程,统一程序中的每个线程都可以独立的执行相同程序。(传统意义上的UNIX进程只是多线程程序的特例,该进程只包含一个线程)在引入线程的OS中,线程作为调度和分派的基本单位,可以有效地改善多处理机系统性能。线程具有像进程一样可被OS调度同一进程的多个线程之间很容易高效率通信在多核心CPU(对称多处理器架构SMP)架构下效率最大化等优势。

  • 同一进程中的线程可以并发执行。
  • 线程本身并不拥有资源,而是仅有一点必不可少的、能保证其独立运行的资源,如用于控制线程运行的线程控制块TCB等。
  • 同一进程中的线程共享进程的内存地址空间和资源。
  • 线程也有三种状态:执行状态、就绪状态、阻塞状态。

2.POSIX线程常用系统调用

启动程序时,产生的进程只有单条线程,称为初始线程或主线程

2.1线程创建与回收

  • pthread_create() 创造子线程
#include <pthread.h>
int pthread_create(pthread_t *thread, 
				   const pthread_attr_t *attr,
                   void *(*start_routine) (void *), 
                   void *arg);

其中thread为指向线程标识符的指针,attr用来设置线程属性,剩下的两个参数分别是该线程执行的函数和函数的参数。

  • pthread_join() 等待(阻塞)回收子线程
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);

thread为被等待的线程标识符,retval为一个用户定义的指针,它可以用来存储被等待线程的返回值。

  • pthread_detach() 分离子线程,分离后主线程不必再去回收子线程
#include <pthread.h>
int pthread_detach(pthread_t thread);

thread为被分离的子线程的标识符。

pthread_join()和pthread_detach()不能同时都选,也不能同时都不选。

2.2线程取消

取消就是强制终止线程。

  • pthread_cancel() 取消子线程
#include <pthread.h>
int pthread_cancel(pthread_t thread);

thread为被取消的子线程的标识符。

  • pthread_setcancelstate()和 pthread_setcanceltype() 子线程设置自己是否允许被取消
#include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);

state参数有两个选项PTHREAD_CANCEL_ENABLE、PTHREAD_CANCEL_DISABLE分别是可以取消和不可取消。pthread_setcanceltype()在state是enable的情况下才有意义,type对于两个参数PTHREAD_CANCEL_DEFERRED子线程不能立即终止和PTHREAD_CANCEL_ASYNCHRONOUS子线程任何时候都立即终止。

2.3线程函数退出相关

  • pthread_exit()或函数里return返回指定值 线程正常退出
#include <pthread.h>
void pthread_exit(void *retval);
  • pthread_cleanup_push()
#include <pthread.h>
void pthread_cleanup_push(void (*routine)(void *),void *arg);
  • pthread_cleanup_pop()
#include <pthread.h>
void pthread_cleanup_pop(int execute);

2.4获取线程id

  • pthread_self()
#include <pthread.h>
pthread_t pthread_self(void);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值