线程

来源:互联网 发布:分词软件 编辑:程序博客网 时间:2024/05/21 08:39

                                                    线程

1、线程的概念:

        有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身

2、多线程概念:

       线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程

总结:
       是进程的执行分支。线程是子进程内部运行的,这里的内部说的是,初始进程创建的地址空间。但是Linux下并没有真正意义上的线程,只有进程模拟的线程,因为Linux并没有给线程一个专门的结构体,而且,CPU也不需要区分进程和县城,他只需执行就行了。所以,线程又叫轻量级进程

在Linux下线程的特点:

       在Linux下无真正意义上的线程,Linux中的线程是由进程模拟出来的。进程是承担分配系统资源的基本实体,线程是操作系统或进程调度的最小单位,线程是进程的执行分支,线程是在进程内部(地址空间)执行的。

3、线程与进程的区别:

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.


区别可以总结如下几点:

a.地址空间和其它资源进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

c.调度和切换:线程上下文切换比进程上下文切换要快得多。

d.在多线程OS中,进程不是一个可执行的实体。


各线程共享以下进程资源和环境: 

1. 文件描述符表 

2. 每种信号的处理⽅方式(SIG_IGN、SIG_DFL或者⾃自定义的信号处理函数)

3. 当前工作目录

4. 用户id和组id 


私有资源:

1. 线程id  

2. 上下文,包括各种寄存器的值、程序计数器和栈指针

3. 栈空间

4. errno变量

5. 信号屏蔽字 

6. 调度优先级


具体代码如下:

     。。。后续补充

线程的分离与结合属性:

       在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached)。⼀一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是不释放的。相反,⼀一个分离的线程是不能被其他线程回收或杀死的,它的存储器 资源在它终⽌止时由系统⾃自动释放。

        一般情况下,线程终止后,其终止状态⼀一直保留到其它线程调用pthread_join获取它的状态为止。 但是线程也可以被置为detach 状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调将返回EINVAL。 对一个尚未detach的线程调用pthread_join或pthread_detach都可以把该线程置为detach状态,也 就是说,不能对同一线程调用两次pthread_join,或者如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。















原创粉丝点击