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. 编程难度提⾼

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

相关推荐
蛋蛋的就会顺顺的8 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8269 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡9 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频10 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
伯恩bourne11 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_11 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs12 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲12 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog12 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616812 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm