Linux 线程初步解析

1.线程概念

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列。在linux中,由于线程和进程都具有id,都需要调度等等相似性,因此都可以用PCB来描述和控制,线程含有PCB,没有独立的地址空间,和进程内的其他线程共享地址空间。如下图:

从资源的角度上看,进程是资源分配的基本单位,线程是cpu调度的基本单位。每一个控制线程pcb,我们都可以看成是执行流,执行流可以是线程,也可以是只有一个线程的进程,在Linux中,所有执行流我们都可以看成轻量级进程(LWP)。

2.线程控制函数

首先,我们要了解Linux没有真正意义上的线程,所有执行流都是LWP,因此,为了满足用户对线程使用的需求,Linux的线程库对LWP的接口进行了封装,我们把库里封装好的线程称为用户级线程。

1.pthread_create创建线程

#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

第一个参数是输出型参数,输出新线程的用户级线程id,参数2:设置线程的属性,参数3:返回值和参数都为void* 类型的函数指针,参数4:函数参数。创建线程,执行传入的函数。

2.pthread_join等待线程

#include <pthread.h>int pthread_join(pthread_t thread, void **retval);

第一个参数是要等的线程id,第二个是线程执行后返回值 。

3. pthread_exit,pthread_cancel,pthread_self() 

int pthread_exit()线程退出,exit()是进程退出。

int pthread_cancel(pthread_t thread)让某个进程退出

pthread pthread_self() 用于获取用户态线程的tid

4.代码

#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <unistd.h>
#include <cstdlib>
#include<time.h>
#include <pthread.h> // 原生线程库的头文件
using namespace std;// pthread_create(pthread_t &tid, nullptr, handlerTask, td);创建线程的接口
//pthread_join(tid, &ret);线程等待
// pthread_exit()线程退出
//pthread_cancel(tid)取消线程
pthread_self() 用于获取用户态线程的tidvoid * handlerTask(void* args)
{string s1=(const char*)args;sleep(10);cout<<"我是"<<s1<<" pid 是 "<<getpid()<<endl;cout<<"我的用户级线程id是"<<pthread_self()<<endl;string* s2=new string("haha");pthread_exit(s2);}int main()
{cout<<"我是主线程"<<" pid 是 "<<getpid()<<endl;cout<<"我的用户级线程id是"<<pthread_self()<<endl;const char* s1="新线程";pthread_t tid;pthread_create(&tid, nullptr, handlerTask, (void*)s1);cout<<"新进程用户级id是"<<tid<<endl;void *ret=nullptr;pthread_join(tid, &ret);cout<<"结果为"<<*((string*)ret)<<endl;
}

makefile 文件(注意一定要链接pthread库)

test1:test1.ccg++ -o $@ $^ -std=c++11 -lpthread
.PHONY:clean
clean:rm -f test1

运行结果:

5.进程分离

  • 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏。
  • 如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源。 
int pthread_detach(pthread_t thread)

可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离.

pthread_detach(pthread_self());

3.用户级进程的实现

在共享区上由pthead动态库来维护,封装了LWP,其中用户级进程的id就是虚拟地址。 

4.资源问题

1.线程私有的:

  • 线程的硬件上下文(cpu寄存器的值)
  • 线程的独立栈结构
  • 线程id
  • 信号屏蔽字
  •  errno 信号屏蔽字
  • 调度优先级

2.线程共享的

  • 内存和地址空间(代码和全局数据)
  • 文件描述符表
  • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id

5.进程线程的优缺点

线程的优点

  • 创建一个新线程的代价要比创建一个新进程小得多(线程的地址内存和地址空间是共享的,只需要创间pcb)
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多(线程切换时由于数据共享,cache不需要重新加载,而进程切换需要重新加载)。
  • 线程占用的资源要比进程少很多
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
  • I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美联储降息应该更早?高盛:有充分理由7月降息,而非9月

KlipC报道&#xff1a;高盛首席经济学家哈祖斯Jan Hatzius表示&#xff0c;美联储“有充分理由”在7月会议上降息&#xff0c;而非等到9月。 在最新发布的报告中&#xff0c;他表明通胀已经取得了足够的进展&#xff0c;回到了美联储2%的长期目标附近&#xff0c;这将使美联储…

实现将Nginx的每个网站配置单独的访问日志

一、问题描述 Nginx默认的访问日志是不会区分哪个网站有哪些日志的,全部糅杂在一起;如果需要哪个网站有哪些访问日志记录,还需要将访问日志下载下来后筛选,比较麻烦;希望将每个网站对应的日志能够单独记录到对应的日志文件里面,方便排查和管理。 # 进入Nginx默认的日志文…

Nest.js 实战 (一):使用过滤器优雅地统一处理响应体

前言 在我们实际的业务开发中&#xff0c;我们可以看到后端接口返回格式都有一定的要求&#xff0c;假如我们统一规定接口的统一返回格式为&#xff1a; {data: any; // 业务数据code: number; // 状态码msg: string; // 响应信息timestamp: number; // 时间戳 }那么在 Nest.…

【智能算法改进】改进的麻雀搜索算法及其求解旅行商问题

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.改进点 改进发现者更新位置 为了使 SSA 算法能够避开向原点收敛的弊端, 将算法向最优位置跳跃的操作转换为向最优位置的移动: X i ,…

自己动手写一个滑动验证码组件(后端为Spring Boot项目)

近期参加的项目&#xff0c;主管丢给我一个任务&#xff0c;说要支持滑动验证码。我身为50岁的软件攻城师&#xff0c;当时正背着双手&#xff0c;好像一个受训的保安似的&#xff0c;中规中矩地参加每日站会&#xff0c;心想滑动验证码在今时今日已经是标配了&#xff0c;司空…

一个篇文章告诉你一个APP前端搭建有多简单

用uni-app 1.新建uni-app项目 点击项目 2.创建 最后点击右下方创建 3.添加tarbar 首先你要创建几个页面这里比如说我有两个页面的tarbar首页(home)和我的(userIndex) 在pages目录下右键新建页面即可

从库存超卖问题分析锁和分布式锁的应用(二)

本文从一个经典的库存超卖问题分析说明常见锁的应用&#xff0c;假设库存资源存储在Redis里面。 假设我们的减库存代码如下&#xff1a; Autowired StringRedisTemplate redisTemplate;public void deduct(){String stock redisTemplate.opsForValue().get("stock"…

JavaSE从零开始到精通

1.前置知识 JVM&#xff1a;java virtrual machine, java虚拟机, 专门用于执行java代码的一款软件。JRE&#xff1a;java runtime enviroment, java运行时环境, java官方提供的核心类库. jre中包含了核心类库和jvm。JDK: java development kit, java开发工具包, javac.exe, ja…

LVS+Keepalive高可用

1、keepalive 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主上&#xff0c;vip漂移到备服务器。 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到住服务器 1、配优先级 2、配置vip和真实服务器 3、主…

我想做信号通路分析,但我就是不想学编程

“我想做信号通路分析&#xff0c;但我就是不想学编程。” “我又不是生信狗&#xff0c;学代码会死。” “你们这些做生信的&#xff0c;整天把数据分析搞得神神秘秘&#xff0c;不就是怕被人抢饭碗而已嘛。” “这都没分析出我想要的结果&#xff0c;不靠谱。” “你们做…

【自学安全防御】二、防火墙NAT智能选路综合实验

任务要求&#xff1a; &#xff08;衔接上一个实验所以从第七点开始&#xff0c;但与上一个实验关系不大&#xff09; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总…

Java爬虫安全策略:防止TikTok音频抓取过程中的请求被拦截

摘要 在当今互联网时代&#xff0c;数据采集已成为获取信息的重要手段。然而&#xff0c;随着反爬虫技术的不断进步&#xff0c;爬虫开发者面临着越来越多的挑战。本文将探讨Java爬虫在抓取TikTok音频时的安全策略&#xff0c;包括如何防止请求被拦截&#xff0c;以及如何提高…

Andriod Stdio新建Kotlin的Jetpack Compose简单项目

1.选择 No Activity 2.选择kotlin 4.右键选择 在目录MyApplication下 New->Compose->Empty Project 出现下面的画面 Finish 完成

C++——类和对象(中)

文章目录 一、类的默认成员函数二、构造函数三、析构函数四、拷⻉构造函数五、赋值运算符重载1. 运算符重载2. 赋值运算符重载 六、取地址运算符重载const成员函数取地址运算符重载 七、应用&#xff1a;⽇期类实现Date.hDate.cpptest.cpp 一、类的默认成员函数 默认成员函数就…

技术成神之路:设计模式(七)状态模式

1.介绍 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许一个对象在其内部状态改变时改变其行为。这个模式将状态的相关行为封装在独立的状态类中&#xff0c;并将不同状态之间的转换逻辑分离开来。 2.主要作用 状态模式的主要作用是让一个…

数据结构—链式二叉树-C语言

代码位置&#xff1a;test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 在现实中搜索二叉树为常用的二叉树之一&#xff0c;今天我们就要通过链表来实现搜索二叉树。实现的操作有&#xff1a;建二叉树、前序遍历、中序遍历、后序遍历、求树的节点个数、求…

MySQL日期和时间相关函数

目录 1. 获取当前时间和日期 2. 获取当前日期 3. 获取当前时间 4. 获取单独的年/月/日/时/分/秒 5. 添加时间间隔 date_add ( ) 6. 格式化日期 date_format ( ) 7. 字符串转日期 str_to_date () 8. 第几天 dayofxx 9. 当月最后一天 last_day ( ) 10. 日期差 datedif…

H. Beppa and SwerChat【双指针】

思路分析&#xff1a;运用双指针从后往前扫一遍&#xff0c;两次分别记作数组a&#xff0c;b&#xff0c;分别使用双指针i和j来扫&#xff0c;如果一样就往前&#xff0c;如果不一样&#xff0c;i–,ans #include<iostream> #include<cstring> #include<string…

SQL server 练习题2

课后作业 作业 1&#xff1a;自己查找方法&#xff0c;将 homework_1.xls 文件数据导入到 SQLServer 的 homework 数据库中。数据导入完成后&#xff0c;把表名统一改为&#xff1a;外卖表 如下所示&#xff1a; 作业 2&#xff1a;找出所有在 2020 年 5 月 1 日至 5 月 31 …

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足以下三种 一致性&#xff08;C:consistency&#xff09;可用性&#xff08;A:Available&#xff09;分区容错性&#xff08;P:Partition Tolerance&#xff09; 这三个基本要求&#xff0c;最多只能同时满足…