上一次的内容是进程控制,到了这一章则是比进程用处更广泛的线程了
学好线程,可是有很大的作用呢!
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
一,线程的概念
在进行线程的学习时,首先来了解一下概念:
线程是进程中的一个实体,自己不拥有资源,(除了运行中的必不可少的资源,如堆栈段,寄存器)
一个线程可以创建/撤销其他的线程,同一个进程中的多个线程可以并发执行,由于线程之间的相互制约
有间断性{就绪,阻塞,运行}
每一个进程至少存在一个线程,如果只有一个线程,那么这个线程 = 进程 = 程序自身
再用用户看来,多个线程同时进行,实质上线程还也是类似于进程一样在进行调度运行,叫做并发
但是,要注意的一点是:在多核CPU的现世代,多个线程可以在不同的CPU上工作,即真正意义上的并行
为什么要有多线程,因为它比多进程有这些优点:
多进程是独立的地址空间(vfork除外)
反观多线程是独立的地址空间,同一进程内的线程,共享此进程的内存空间
所以,多线程更具有时间优势
系统调度方面
在系统调度方面,因为线程共享内存空间,所以在线程调度切换上更具有优势,内部直接进行通信
而进程之间的系统调度,则需要信号机制调度,必经过操作系统,时间上更麻烦
另外的一些优势
使用线程,可以提高响应速度,可以提高多处理器效率,改善程序结构
在我自己的理解看来,
线程也没有多神秘,其实就是在进程中继续划分的更小的计算机工作单位,可以更好地提高效率,节省时间
上面提到了,同一进程内的线程线程共享进程的地址空间,但是,线程也有其私有数据(区别于之后的“私有数据”)
线程号,ThreadID
寄存器 [程序计数器,堆栈指针]
堆栈
信号掩码
优先级
线程的私有存储空间
Linux系统下,不同于进程,线程的实现方式基于POSIX多线程标准
所有线程的操作,都是基于POSIX基准的接口函数
所以,在进行编译时,要链接动态库 -lpthread
下面说一些线程其他事情吧:
为什么会有线程出现?
上世纪60年代,出现了进程的概念,方便工程师进行程序的设计,
但是,随着科学日益进步,工程量的增加,进程已经明显不能满足需求了
主要问题体现在两点上:
进程较大的时 + 空开销(时间,空间的开销都大)
SMP,对称多处理机的出现,是同时运行几个程序成为了可能,但是使用进程的开销会很大
就这样,在需求不段增长的时候,80年代,线程就出生了.
线程有几种调度方式?
线程进行调度分为三种:
<1>. 操作系统内核线程 e.g.Win32线程
<2>. 用户线程 e.g.POSIX Thread
<3>. 内核与用户线程混合调度 e.g.Win7 线程
线程的属性
最早在Linux环境下,并没有真正的实现线程,所使用的名为”轻量进程”,实则用进程来实现线程功能
直至后来,才再真正意义上实现了线程
线程 = 程序(代码) + 数据 + TCB(类似于PCB)
而其动态特性,则由TCB进行描述:
线程状态 + 线程不运行时资源问题 + 执行堆栈 + 线程局部变量主存区 + 访问同一进程主存与其他资源
最后,用一句话来描述线程与进程的关系 : 进程是线程的容器,线程是进程执行程序真正实体
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
二,线程操作
1.创建线程
#incldue<pthread.h>
int pthread_creat(pthred_t *thread,pthread_attr_t *attr,
void *(*start_routine)(void *), void arg)
pthread_creat,线程创建函数
其作用是:创建线程号为thread,线程属性为attr,执行参数为arg的start_routine函数的线程
创建一个新的线程后,线程也去执行新的程序,类似于进程的exec系函数,但是在内存空间上分配有不同之处
新创建的线程去运行指针指向的函数,而原线程继续执行接下来的操作
再来看几个函数:
函数 | 说明 |
---|---|
pthread_t pthread_self(void) | 类似于getpid(),获取线程自身线程ID |
int pthread_equal(pthread_t thread1,pthread_t thread2) | 判断两个进程是否为同一进程 |
i |