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

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

相关推荐
2601_962071571 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491112 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水2 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero3 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-4 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
zww89491114 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设5 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳6 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥6 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
_Twink1e6 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen