一、线程的概念
线程,有时被称为轻量级进程(LWP),是程序执行的最小单元。一个标准的线程由线程ID,当前指针(PC),寄存器集合和堆栈组成。另外,线程是一个进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程可以并行执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行 ,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序至少有一个 线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个独立的、可调度的执行单元,是系统独立调度和分配CPU的基本单位。在一个单个程序中同时运行多个线程完成不同的工作,称为多线程。
二、线程的分类
线程有俩个基本类型:
用户级线程:管理过程全部由用户完成,操作系统内核心只对进程进行管理。
系统级线程(核心级线程):有操作系统内核进行管理。操作系统 内核给应用程序提供相应的系统调用和应用程序接口API,一使用户程序可以创建、执行和撤销线程。
三、属性
1>轻型实体:线程的实体基本上不拥有系统资源;
2>独立调度和分派的基本单元:在多线程OS中,线程是能独立运行的基本单元,因此也是独立调度和分派的基本单元。由于线程很“轻”,故线程的切换非常迅速并开销小;
3>可并发执行:在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行。
4>共享进程资源:在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚拟地址;此外,还可以访问进程所拥有的一打开文件,定时器、信号量机构等。
四、进程与线程的比较
进程和线程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间 ,每一个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要计算机的内存资源和CPU。
通常在一个进程中包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单元。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小很多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。
线程与进程区别可以归纳为以下几点:
1>地址空间和其他资源(如打开文件):进程间相互独立,同一进程的个线程共享。某进程内的线程在其他进程不可见。
2>通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,与保证数据的一致性。
3>调度和切换:线程上下文切换比进程上下文切换要快得多。
4>在多线程OS中,进程不是一个可执行的实体。
五、线程的创建、等待和结束的代码实现
程序代码:
#include<stdio.h>
#include<pthread.h>
void * thread_run(void* arg){
printf("I am %s\n",(char*)arg);
//线程的结束
return (void *)1;
}
//主函数
int main(){
pthread_t tid;
//线程的创建
pthread_create(&tid,NULL,thread_run,"thread 1");
//线程的等待
void* ret;
pthread_join(tid,&ret);
printf("main thread run new thread ret:%d\n",(int)ret);
return 0;
}
检测结果: