Linux -- 线程的优点、pthread 线程库

目录

线程的优点

pthread 线程库 

前言

认识线程库

简单验证线程的独立栈空间


线程的优点

与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少得多。

调度进程时,CPU 中有一个 cache(缓存,提高运行效率),CPU在虚拟地址转物理地址后,在内存中找到了一行代码,然而程序在运行时,比如运行到了第50行代码,下一次大概率会运行下一行代码,也就是第51行代码,也有可能跳转到其他代码,但是大概率还是运行下一行代码,所以系统把第50行代码的周边代码都加载到 cache 中,CPU 在运行时直接从 cache 中读取代码,提高 CPU 寻址效率。

进程切换时,会把当前缓存到 cache 的数据都切换掉,而线程切换时,寄存器中的数据会被切换,但 cache 中的数据不会被丢弃,大概率还是可以用的,线程切换只需要更改少量寄存器和栈指针等信息,而不需要像进程那样进行完整的上下文切换。所以线程切换时操作系统做的工作比进程的切换少。

创建一个新线程的代价要比创建一个新进程小得多,线程占用的资源比进程少得多。

进程是资源分配的基本单位,线程是调度的基本单位,当多个线程属于同一个进程时,它们会共享以下资源:

  1. 地址空间:包括代码段、数据段、堆区和栈区(每个线程有自己的栈)。所有线程都可以访问进程的整个虚拟地址空间,这意味着它们可以读写相同的全局变量和静态变量。

  2. 打开的文件描述符:如文件、网络连接等。所有线程都能操作这些描述符,因此对文件或网络连接的操作可以在不同线程间共享。

  3. 环境变量:进程启动时设置的环境变量是所有线程共有的。

  4. 内存映射:如果进程使用了内存映射文件或其他形式的内存映射,那么这些映射也是所有线程可见并可访问的。

  5. 信号处理程序:虽然信号通常是针对整个进程的,但某些信号(如SIGSEGV)可以由特定线程捕捉到,并且线程可以安装自己的信号处理器。

  6. 当前工作目录:所有线程共享同一进程的工作目录,任何线程改变工作目录都会影响其他线程。

  7. 用户ID和组ID:与安全性和权限相关的标识信息是所有线程共有的。

  8. 资源限制:例如最大文件大小、CPU时间等,这些限制适用于整个进程,因此也适用于所有线程。

因为多个线程共享资源,所以一个线程占用的资源比进程少。

但是线程也会有自己私有的资源

  1. 栈空间每个线程都有自己的栈,用于存储函数调用时的局部变量、返回地址等信息。这是线程之间保持独立性的关键之一,因为每个线程可以在其栈上进行独立的操作而不干扰其他线程。

  2. 寄存器集合(上下文数据):当线程被调度执行时,它有自己的寄存器集,包括程序计数器(PC)、堆栈指针和其他通用寄存器。这些寄存器保存了线程执行的状态信息。

  3. 线程ID:操作系统赋予每个线程一个唯一的标识符(TID),用于区分不同的线程。这个ID是线程私有的,因为它唯一地识别了一个线程。

  4. 线程优先级和调度属性:某些系统允许为每个线程设定独立的调度参数,如优先级和策略,这些属性影响线程的执行顺序和时间片分配。 

pthread 线程库 

前言

Linux 的线程是用进程模拟的,线程在Linux底层被视为轻量级进程。对于同一个进程中的新、主线程,可以看出线程的 tid 和 LWP 的数值是不一样的:

线程被创建、等待、分离、终止,且拥有独立的栈结构,这些都是系统在管理线程,

1、系统管理线程时,并没有对用户暴露 在系统中线程被视为轻量级进程的事实,用户认为那就是线程;

2、系统中没有线程的概念,只有轻量级进程的概念,用户却能创建管理、操作线程。

能实现以上两点是因为系统对底层的轻量级进程进行了封装,用户能操作线程都是因为有了库,所以在Linux中线程也叫做用户级线程。既然线程因库而起,就应该由库来维护。

认识线程库

为了管理线程,“先描述再组织”,定义线程的控制块 TCB,TCB是操作系统内核用来管理和调度线程的数据结构

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

pthread_create 的第一个参数 thread 是一个 pthread_t 类型的输出型参数,函数调用结束后,thread 指向一个虚拟内存单元,该内存单元的地址即为新创建线程的线程 ID,所以 pthread_t 类型的线程 ID 实际上就是一个进程地址空间的一个地址!线程库的后续操作就是根据该线程 ID 来操作线程的,用户也可以调用 pthread_self 函数来获得线程自身的 ID。

线程库中还包含了一系列用于创建、管理和操作线程的函数、类和数据结构。具体来说,一个典型的线程库会提供以下组件:

1. 线程管理

  • 创建线程:函数或构造函数用来启动一个新的线程,通常需要指定要在线程中执行的函数(即线程函数)。

    • 示例:pthread_create() (POSIX Threads)
  • 销毁/终止线程:方法来结束线程的执行,可以是自然结束(当线程函数返回时),也可以是通过特定API强制结束。

    • 示例:pthread_cancel()std::thread::join() 或 std::thread::detach()
  • 等待线程完成:允许主线程或其他线程等待某个特定线程完成其任务。

    • 示例:pthread_join()std::thread::join()

2. 线程同步机制

为了确保多个线程之间安全地共享资源,线程库提供了各种同步工具:

  • 互斥锁(Mutex):防止多个线程同时访问临界区代码段。

    • 示例:pthread_mutex_tstd::mutex
  • 读写锁(Read-write Locks):允许多个读者或单个写者访问资源。

    • 示例:pthread_rwlock_t
  • 条件变量(Condition Variables):用于线程间的通信,一个线程可以在满足特定条件时唤醒另一个线程。

    • 示例:pthread_cond_tstd::condition_variable
  • 信号量(Semaphores):控制对有限数量资源的访问。

    • 示例:sem_t (POSIX Semaphores)

3. 线程属性设置

  • 设置线程属性:在创建线程之前,可以设定一些线程属性,如栈大小、调度策略等。
    • 示例:pthread_attr_t (POSIX Threads)

4. 线程本地存储(TLS)

  • 线程局部数据:为每个线程提供独立的数据副本,即使这些变量是在全局范围内声明的。
    • 示例:pthread_key_create()pthread_getspecific()pthread_setspecific()std::thread_local (C++)

5. 高级特性

  • 线程池:预先创建一组工作线程,以便快速响应任务请求而不必频繁创建和销毁线程。

    • 示例: C++ 中可以通过第三方库如Boost实现。
  • 并发容器:线程安全的数据结构,例如队列、堆栈、哈希表等。

    • 示例:std::shared_timed_mutexconcurrent_queue (Intel TBB)
  • 原子操作:提供无锁编程的支持,保证某些操作的原子性。

    • 示例:std::atomic (C++)

6. 工具和辅助函数

  • 当前线程信息:获取当前线程ID等信息。

    • 示例:pthread_self()std::this_thread::get_id()
  • 线程调度:调整线程优先级或让出CPU给其他线程。

    • 示例:sched_yield()std::this_thread::yield()

简单验证线程的独立栈空间

#include<iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;
#include<string>void* newthreadRun(void* args)
{std:string threadname=(char*)args;int cnt=5;while(true){std::cout<<"I am "<<threadname<<",cnt: "<<cnt<<", &cnt: "<<&cnt<<std::endl;cnt--;sleep(1);}return nullptr;
}int main()
{pthread_t tid1;pthread_t tid2;pthread_create(&tid1,nullptr,newthreadRun,(void*)"thread-1");   pthread_create(&tid2,nullptr,newthreadRun,(void*)"thread-2");pthread_join(tid2,nullptr);pthread_join(tid1,nullptr);return 0;
}

同一局部变量的地址不同, 说明每个线程的栈空间都私有一份该变量

 

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

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

相关文章

【magic-dash】01:magic-dash创建单页面应用及二次开发

文章目录 一、magic-dash是什么1.1 安装1.2 使用1.2.1 查看内置项目模板1.2.2 生成指定项目模板1.2.3 查看当前magic-dash版本1.2.4 查看命令说明1.2.5 内置模板列表二、创建虚拟环境并安装magic-dash三、magic-dash单页工具应用开发3.1 创建单页面项目3.1.1 使用命令行创建单页…

从零开始使用MaxKB打造本地大语言模型智能问答系统与远程交互

文章目录 前言1. 下载运行Ollama2. 安装大语言模型3. 安装Cpolar工具4. 配置公网地址5. 固定公网地址6. MaxKB 添加Olama7.创建问答应用 前言 目前大语言模型&#xff08;LLM&#xff09;已经成为了人工智能领域的一颗璀璨明星&#xff0c;从自然语言处理到智能问答系统&#…

深度解析 Pytest 中的 conftest.py

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 在使用 Pytest 进行测试的过程中&#xff0c;conftest.py 文件扮演着极为重要的角色…

【python】银行客户流失预测预处理部分,独热编码·标签编码·数据离散化处理·数据筛选·数据分割

数据预处理 通过网盘分享的文件&#xff1a;银行流失预测数据和代码 链接: https://pan.baidu.com/s/1loiB8rMvZArfjJccu4KW6w?pwdpfcs 提取码: pfcs 非数值特征处理 目的&#xff1a;将非数值特征转换为数值型&#xff0c;以便模型能够处理。方法&#xff1a; 地理位置&am…

回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测

回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实现CNN-LSSVM…

slam学习笔记7---状态量求导相关数学公式

前言&#xff1a;本来打算只是归纳一下数学求导相关公式&#xff0c;后面也写了旋转求导相关内容&#xff0c;哈哈。感觉有点发散把握不住呀。水平有限&#xff0c;欢迎评论区点出。 一、基本初等函数求导公式 ( C ) ′ 0 , C (C)0,C (C)′0,C为常数 ( x μ ) ′ μ x μ −…

32单片机串口数据接收、空闲IDLE中断详解

一、前提说明 一开始写单片机程序的时候不太清楚空闲中断这个东西&#xff0c;每次用串口接收数据&#xff0c;都要再开一个定时器&#xff0c;在定时器内进行倒计时&#xff0c;每次接收数据就重置计时时间&#xff0c;计时结束就触发中断&#xff0c;再判断所有接收的数据&am…

深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223

深入探讨 Go 中的高级表单验证与翻译&#xff1a;Gin 与 Validator 的实践之道 在现代后端开发中&#xff0c;表单验证是保证数据完整性和服务稳定性的核心环节。如何优雅、高效地实现表单验证&#xff0c;同时提供人性化的错误提示&#xff0c;是每位开发者的必修课。在本文中…

掌握 Ansys ACP 中的参考方向:简化复杂的复合材料设计

概括 在复合材料分析领域&#xff0c;精度至关重要&#xff0c;尤其是在定义纤维方向和铺层时。Ansys ACP&#xff08;Ansys Composite PrepPost&#xff09;提供了强大的工具来建立参考方向&#xff0c;这是实现精确结构模拟的关键步骤。在本博客中&#xff0c;我们将揭开在 …

Vue2学习(一)——Vue简介、Vue指令与指令修饰符

一、Vue简介 Vue是一套用于构建用户界面的渐进式框架。 所谓渐进式就是循序渐进&#xff0c;不一定非得把Vue中的所有API都学完才能开发Vue&#xff0c;可以学一点开发一点。 Vue2官网地址&#xff1a;https://v2.cn.vuejs.org/ Vue3官网地址&#xff1a;https://cn.vuejs…

Redis--通用命令学习

目录 一、引言 二、基础命令 1.set 2.get 3.keys 3.1 keys &#xff1f; 3.2 keys * 3.3 keys [abe] 3.4 keys [^] 3.5 keys [a-b] 4.exists 5.delete 6.expire 7.ttl 8.type 三、Redis中的过期策略&#xff08;面试题&#xff09; 1.惰性删除 2.定期删除 …

Linux程序设计(第四版)| 学习笔记

上次学习Linux相关内容还是上学的时候为了应付考试&#xff0c;最近有项目涉及Linux&#xff0c;重新学习以下。 很多年前关于Linux的总结 一、入门 1.概念 (1) UNIX 1)定义&#xff1a;指的是一种遵循特定规范的计算机操作系统。 2)特点&#xff1a;简单性、集中性、可重用…

PostgreSQL 的历史

title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能强大且广泛使用的开源关系型数据库管理系统。其历史可以追溯到1986年,当时由加州大学伯克利分校的一个研究团队开发。文章将深入探讨 PostgreSQL 的起源、…

Ubuntu22.04 LTS 安装nvidia显卡驱动

准备跑老师给定的Github上的多模态源码,但是用了这么久ubuntu还没有尝试过安装nvidia驱动,好在也是一次成功,于是记录下来。 借鉴的是Ubuntu22.04安装显卡驱动(高速、避错版)-CSDN博客这篇文章,按照流程来基本没有问题,不过个人觉得有些步骤比较冗余,所以记录下来 主要…

WPS工具栏灰色怎么办

WPS离线不登录&#xff0c;开启工具栏等相关功能 当你在使用WPS的过程中&#xff0c;若因网络问题或其他特殊原因&#xff0c;导致无法登录使用WPS时&#xff0c;可根据以下步骤开启离线兼容模式&#xff0c;开启此模式后&#xff0c;可在未登录的状态下&#xff0c;激活并使用…

国标GB28181-2022平台EasyGBS:安防监控中P2P的穿透方法

在安防监控领域&#xff0c;P2P技术因其去中心化的特性而受到关注&#xff0c;尤其是在远程视频监控和数据传输方面。P2P技术允许设备之间直接通信&#xff0c;无需通过中央服务器&#xff0c;这在提高效率和降低成本方面具有明显优势。然而&#xff0c;P2P技术在实际应用中也面…

Mac Android studio 升级LadyBug 版本,所产生的bug

当Build 出现&#xff0c;这样的文字以后&#xff1a; Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.3.3. Cannot sync the project. We recommend upgrading to Gradle version 8.9. The minimum compatible Gradle version is 8.5. …

com.google.common.collect.ImmutableList$SerializedForm

今天AndroidStudio安装了个2021版本的&#xff0c;gradle用了7.3.3&#xff0c;创建项目后控制台总是有这样一个错误&#xff1a; Unable to load class com.google.common.collect.ImmutableList$SerializedForm. This is an unexpected error. Please file a bug containing…

Docker部署Sentinel

一、简介 是什么&#xff1a;面向分布式、多语言异构化服务架构的流量治理组件 能干嘛&#xff1a;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 官网地址&#xff1a;https://sentinelguard.io/zh-c…

HTMLCSSJavaScriptDOM 之间的关系?

一、HTML 中文名&#xff1a;超文本标记语言 英文名&#xff1a;HyperText Markup Language HTML是一种用来结构化Web网页及其内容的标记语言。 HTML 由一系列的元素组成&#xff0c;这些元素可以用来包围不同部分的内容&#xff0c;使其以某种方式呈现或者工作。 图Ⅰ 每…