线程概念
线程是进程内部的一个执行分支,执行粒度比线程更细,比如下面的图片

从上面的图片来看,线程是进程里面的一个执行分支,而且线程是共享进程内部的资源的,也就是说,进程是资源分配的基本单位,线程是调度的基本单位,需要注意的是,在linux中是没有真正意义上的线程这一说法的,线程其实就是一个轻量级进程(LWP),而且linux要支持线程的话,就必须需要对线程有一个管理,还是那句话,先描述再组织,但是重现弄一个结构来描述一下线程是否太麻烦,于是linux选择复用进程的PCB,再线程这里叫做TCB,下面我们写一个程序
cpp
#include <pthread.h>
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void *),
void *restrict arg);
参数说明
返回值:成功返回0,失败返回>0的数
thread:线程id
attr:线程属性,一般设置为空
void *(*start_routine)(void *):想要执行的函数,返回值为void *,参数为void *
arg:执行函数的参数
cpp
#include <iostream>
#include <unistd.h>
#include <pthread.h>
void *run(void *arg)
{
while(true)
{
std::cout << "new thread" << std::endl;
sleep(1);
}
}
int main()
{
pthread_t tid;
pthread_create(&tid,nullptr,run,(void *)"ptread1");
while(true)
{
std::cout << "main thread" << std::endl;
sleep(1);
}
return 0;
}
运行结果(编译的时候需要加上-lpthread,因为这是线程这是一个库)

使用下面的命令查看一下

我们可以看见两个线程同时属于一个进程,各自拥有一个lwp
线程的优点
1.创建线程比创建进程的代价要小得多,原因是创建进程需要重新创建一些资源(PCB,页表映射等),但是线程是共享进程的资源的
2.线程切换的代价比进程的小,原因是切换进程需要替换大量寄存器当中的内容,即上下文的切换,同时进程切换会重新替换cache等结构的内容,但是线程不需要这些操作
4.线程占⽤的资源要⽐进程少
5.能充分利⽤多处理器的可并⾏数量
6.在等待慢速I/O操作结束的同时,程序可执⾏其他的计算任务?
7.计算密集型应⽤,为了能在多处理器系统上运⾏,将计算分解到多个线程中实现
8.I/O密集型应⽤,为了提⾼性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。?
线程的缺点
1.健壮性降低
编写多线程需要更全⾯更深⼊的考虑,在⼀个多线程程序⾥,因时间分配上的细微偏差或者因共享了不该共享的变量⽽造成不良影响的可能性是很⼤的,换句话说线程之间是缺乏保护
的
2.缺乏访问控制
进程是访问控制的基本粒度,在⼀个线程中调⽤某些OS函数会对整个进程造成影响。?
- 编程难度提⾼
编写与调试⼀个多线程程序⽐单线程程序困难得多