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

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

相关推荐
zhanghaha13145 小时前
Python进阶教程:5_XML 解析 —— 新手完全指南
java·前端·数据库
万亿少女的梦1685 小时前
基于Spring Boot、Vue与MySQL的私人健身教练预约管理系统设计
java·spring boot·mysql·vue·预约管理
程序员黑豆5 小时前
Java字符串拼接全解析:6种方式性能对比与实战指南
java·前端·ai编程
特立独行的猫a7 小时前
Windows安装Rust环境 Clang替代GCC MinGW环境LLVM工具链(详细教程)
开发语言·windows·rust·mingw·环境搭建·llvm
程序员黑豆12 小时前
Java字符串详解
java·前端·ai编程
m0_7202450113 小时前
1543.统计好三元组(简单)
开发语言·算法
EntyIU14 小时前
NFS离线部署
java
叠层归一研究院14 小时前
AGI 系统(八):符号范畴嵌入函子 — SymCat ↪ C_M107 严格化
c语言·开发语言·人工智能·算法·transformer·agi
明朝百晓生14 小时前
Deep RL learning[2026/8]
开发语言·javascript·人工智能
weixin-a1530030831615 小时前
python-装饰器
开发语言·python