文章目录
线程概念:
线程概念:线程是进程中的一条执行流,负责进程中一段代码的运行调度,一个进程中可以有一个或多个线程。
在Linux下,线程是通过pcb实现的,一个进程中可以有多个pcb,这些pcb共享进程中的大部分资源,因此也被称作轻量级进程。
线程就是进程中的一条执行流,而在Linux下执行流通过pcb来实现,一个进程中可以有多个执行流pcb,这些pcb共享进程中的大部分资源,相较于传统pcb较为轻量化,因此也被称作轻量级进程。
线程与进程的关键性区别:
进程是系统进行资源分配的基本单元
线程是系统进行运行调度的基本单元
线程间的独有与共享:
独有:标识符、栈、寄存器、信号屏蔽字、errno…
共享:虚拟地址空间、IO信息、信号处理方式、工作路径…
多进程与多线程进行多任务处理的优缺点:
线程优点:
1、线程间通信更加灵活,包含进程间通信在内,还可以使用全局变量以及函数传参实现通信
2、线程的创建与销毁成本更低
3、线程间的调度成本低
进程的优点:稳定,健壮。 应用场景:shell、网络服务器…
线程不是越多越好,cpu资源是固定的,线程给多了反而会增加线程的切换调度成本
cpu密集型程序:程序中进行大量的数据运算,对cpu资源要求高
IO密集型程序:程序中进行大量的IO操作,对cpu资源要求并不高
线程控制
线程控制包括四个方面:创建、退出、等待、分离
创建
操作系统在底层并不会区分轻量级进程与线程,所以操作系统实际上并没有提供用于创建线程的接口,后来的大牛们通过封装实现了线程控制对应所需的库函数,用于对线程操作。
int pthread_creat(pthread_t *tid, pthread_attr_t *attr,
void*(*routine)(void*), void *arg);
pthread_t *tid:(输出型参数) 用于接收线程ID----tid
pthread_attr_t *attr: 设置线程属性----通常置NULL
void*(*routine)(void*): 线程入口函数,入口函数运行完毕后,退出线程
void *arg:传递给线程的数据,就是传递给上面这个入口函数的形参
返回值:
成功返回0;失败返回非0—错误编号。
代码示例:
注意:线程的操作都是通过库函数来实现的,所以在编译和运行相关代码时,需要链接pthread动态库
命令操作:gcc creat.c -o creat -lpthread
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void *thr_entry(void* arg){
while(1){
printf("normal thread--%s\n",(void*)arg);
sleep(1);
}
return NULL;
}
int main(){
//pthread_create(tid, 线程属性, 入口函数, 参数 )
pthread_t tid;
char *ptr="好好学习~";
int ret=pthread_create(&tid,NULL,thr_entry,(void*)ptr);
if(ret!=0){
printf("thread_create error!");
return -1;
}
while(1){
printf("天气真好\n")