1.线程的概念
进程概念
是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称,从操作系统核心角度来说,进程是操作系统调度除CPU时间片外进行的资源分配和保护的基本单位,它有一个独立的虚拟地址空间,用来容纳进程映像(如与进程关联的程序与数据),并以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程(进程间通信),linux系统都是通过task_struct结构来管理的,task_struct也被称为“进程描述符”。
最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题。
线程是在进程中产生的一个执行单元,是CPU调度和分配的最小单元,其在同一个进程中与其他线程并行运行,他们可以共享进程内的资源,比如内存、地址空间、打开的文件等等。
线程是CPU调度和分派的基本单位,
进程是分配资源的基本单位。
那到底如何理解进程和线程呢?
假定工厂的电力有限,一次只能供给一个或少量几个车间使用。也就是说,一部分车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务,多个CPU能够运行少量任务。
进程就好比工厂的车间,它代表CPU所能处理的单个任务。就好比工厂给与车间配备一定的装备、办公场所和工人。
一个车间里,可以有很多工人。他们协同完成一个任务。
线程就好比车间里的工人。一个进程可以包括多个线程,他们协同完成某一个任务。
线程是CPU调度和分派的基本单位,而进程是分配资源的基本单位。
创建线程的方法
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
Thread : 线程标识符;
attr:线程的属性,如果为NULL表示使用默认的属性值,一般填写NULL就够了,默认的属性为非绑定、非分离、缺省的堆栈、与父进程同样级别的优先级。对属性的设置在创建线程之前,先用pthread_attr_init初始化,然后调用相关接口设置属性,
√__detachstate:分离性,表示新线程是否与进程中其他线程脱离同步。
√__schedpolicy:主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。
√__schedparam:设置线程的优先级。SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。是不是优先级越高就一定优先执行?
√__inheritsched:表示是否采用__schedpolicy指定的调度策略。
√__scope:绑定性,牵扯到轻进程的概念,线程的调用实际是依附在轻进程上调用的。
start_routine : 线程函数的名
arg:传递给start_routine的参数
成功返回0,否则返回错误码,此时thread的值是未被定义的
线程的终止
√ 从线程函数return,这是最推荐的办法。
√ 一个线程可以调用pthread_cancel终止同一进程中的另一个线程:
int pthread_cancel(pthread_t thread);
√ 线程可以调pthread_exit终自己;
√ 调用pthread_kill发送一个信号终止同一进程中的另一个线程;
线程的回收
int pthread_join(pthread_t tid, void **status);
pthread_join()函数会一直阻塞调用线程,直到指定的线程tid终止。当pthread_join()返回之后,应用程序可回收与已终止线程关联的任何数据存储空间,但是还有一些线程,更喜欢自己来清理退出 的状态,他们也不愿意主线程调用pthread_join来等待他们。我们将这一类线程的属性称为detached(分离的)。
2.为什么需要多线程
避免阻塞
大家知道,单个进程只有一个主线程,当主线程阻塞的时候,整个进程也就阻塞了,无法再去做其它的一些功能了。
避免CPU空转
应用程序经常会涉及到RPC,数据库访问,磁盘IO等操作,这些操作的速度比CPU慢很多,而在等待这些响应时,CPU却不能去处理新的请求,导致这种单线程的应用程序性能很差。
提升效率
一个进程要独立拥有4GB的虚拟地址空间,而多个线程可以共享同一地址空间,线程的切换比进程的切换要快得多。
3.多线程会带来什么问题
车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
如果一个厕所只能容纳一个人,那有多个人要上厕所怎么办?
也就是说对多个线程共享的内存进行读写时需要做好某种机制使得有秩序低访问。
由于内容太多,已经为大家整理好PDF文档。以下资料,需要的关注,私信:“资料”
网友评论