多线程概念
在传统操作系统上pcb是一个进程,描述一个程序的运行,还有一个tcp描述实现线程,但是在linux下使用pcb描述实现了程序调度并且这些pcb共用同一个虚拟地址空间,相较于传统的pcb更加轻量化一点,因此也把linux下的pcb称之为轻量级进程。
进程是系统资源分配的基本单位。
线程是CPU调度的基本单位。
线程间的独有与共享:
独有:栈,寄存器,信号屏蔽字,errno,标识符
共享:虚拟地址空间(代码段,数据段),文件描述表,信号处理方式,工作路径,用户ID,组ID
多进程/多线程进行多任务处理(优缺点):
多线程:线程间通信更加方便灵活(全局变量,函数传参)
线程的创建/销毁成本更低
线程间的调度成本更低
异常和某个系统调用针对的是整个进程。
多进程:具有独立性,因此更加稳定,健壮。
例如:对主功能程序安全性稳定性要求更高的最好使用多进程(shell/服务器),剩下的使用多线程
共同优点:
CPU密集型程序/IO密集型程序
并行压缩CPU处理/并行压缩IO等待时间
在CPU资源足够的情况下,可以使程序的性能更高
线程控制
线程控制的接口都是库函数(操作系统并没有向用户提供创建一个轻量级进程的接口,因此大佬门才封装的一套线程控制接口,所以在使用的时候链接库文件 -lpthread)
线程创建
int pthread_create(pthread_t tid,pthread_attr_t attr,void(thread_routine)(voidarg),void arg);**
tid:用于获取线程id,通过这个id可以找到线程的描述信息,进而访问pcb(轻量级进程完成控制)【线程在虚拟地址空间中开辟的线程空间的首地址(线程信息)】
attr:线程属性,通常置NULL
thread_routine:线程入口函数,创建一个线程就是为了运行这个函数,函数运行完毕,则线程退出
arg:通过线程入口函数传递给线程的参数
返回值:0-成功,非0值-失败errno
ps -efL | grep create:查看线程
代码演示:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
void* thread_start(void* arg){
while(1){
printf("主线程传递了一个参数:%s\n",(char*)arg);
sleep(1);
}
return NULL;
}
int main(){
pthread_t tid;//无符号长整形
char buf[]="好运来~\n";
int ret=pthread_create(&tid,NULL,thread_start,(void*)buf);
if(ret!=0){
printf("thread create error:%d\n",ret);