linux线程

线程概念

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

从上面的图片来看,线程是进程里面的一个执行分支,而且线程是共享进程内部的资源的,也就是说,进程是资源分配的基本单位,线程是调度的基本单位,需要注意的是,在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函数会对整个进程造成影响。?

  1. 编程难度提⾼

编写与调试⼀个多线程程序⽐单线程程序困难得多

相关推荐
满怀冰雪1 小时前
第13篇-栈算法入门-括号匹配-表达式与单调栈基础
java·算法
我是一颗柠檬1 小时前
【Java项目技术亮点】Redis Lua脚本原子化操作:高并发场景下的终极武器
java·redis·lua
swg3213211 小时前
Redis实现主从选举
java·前端·redis
码云骑士1 小时前
03-Python可变对象与不可变对象(下)-深浅拷贝的底层真相
开发语言·python
Java 码思客1 小时前
【ElasticSearch 从入门到架构师】第6章_分词器与文本检索
java·elasticsearch
Flittly1 小时前
【AgentScope Java新手村系列】(6)Hook与Middleware
java·spring boot·笔记·spring·ai
向量引擎1 小时前
AI API 正在进入“请求生命周期治理”阶段:从模型迁移、Agent 接入到成本与安全排错的工程化方法
java·人工智能·python·aigc·ai编程·ai写作·gpu算力
sycmancia1 小时前
Qt——自定义模型类
开发语言·qt
MATLAB代码顾问2 小时前
Python数据分析项目实战:销售数据仪表盘
开发语言·python·数据分析