当前位置: 首页 > news >正文

线程ID和线程库

在linux中,线程的运行可以用lwp来标识,只是操作系统的标识方法,lwp表示轻量级进程,在Linux中,进程和线程都可以用lwp来标识,而对于用户来说,也有对应的线程ID,

线程库

在linux中,运行线程时,要链接上线程库,而线程ID就是线程库用来标识线程的,

当我们执行一个进程时,要把代码和数据从磁盘中加载到内存中,建立task_struct,当我们要创建线程时,要把动态库加载到内存中,然后通过页表映射到虚拟地址空间中,

关于线程的管理,也是在线程库中进行管理的,每创建一个线程,就会有一个管理线程的strcut tcb,其中包含线程ID,线程局部储存,线程栈等等,本质上,它就是内存上的·一段空间,线程ID本质上就是虚拟地址,

___thread关键字

__thread 是 GCC 提供的一个关键字,用于声明线程局部存储(Thread-Local Storage,TLS)。使用 __thread 声明的变量会为每个线程创建一个独立的实例,这意味着每个线程访问的都是自己的变量副本,而不是共享的全局变量。

比如说

__thread int thread_var=10;

thread_var的作用域是全局,但是每个线程都会单独创建一个thread_var的局部变量,与全局的thread_var不冲突

线程的封装

#pragma once
#include <iostream>
#include <string>
#include <pthread.h>namespace Thread_ljp
{typedef void (*func_t)(const std::string &name);class Thread{public:void Excute(){std::cout<<_name<<" is running"<<std::endl;_isrunning=true;_func(_name);_isrunning=false;}public:Thread(const std::string& name,func_t func):_name(name),_func(func){std::cout<<"creat "<<name<<" done"<<std::endl;}static void* ThreadRoutine(void* args){Thread* self=static_cast<Thread*>(args);self->Excute();return nullptr;}bool Start(){int n=::pthread_create(&_tid,nullptr,ThreadRoutine,this);if(n!=0)return false;return true;}std::string Status(){if(_isrunning)return "running";return "sleep";}void Stop(){if(_isrunning){::pthread_cancel(_tid);_isrunning=false;std::cout<<_name<<"stop"<<std::endl;}}void Join(){::pthread_join(_tid,nullptr);std::cout<<_name<<" Joined"<<std::endl;}std::string Name(){return _name;}~Thread(){}private:std::string _name;pthread_t _tid;bool _isrunning;func_t _func;};
}

#include <iostream>
#include <vector>
#include <cstdio>
#include <unistd.h>
#include "Thread.hpp"using namespace Thread_ljp;void Print(const std::string &name)
{int cnt = 1;while (true){std::cout << name << "is running, cnt: " << cnt++ << std::endl;sleep(1);}
}
const int gnum = 10;
int main()
{// 管理原生线程std::vector<Thread> threads;for (int i = 0; i < gnum; i++){std::string name = "thread-" + std::to_string(i + 1);threads.emplace_back(name, Print);sleep(1);}// 启动线程for (auto &thread : threads){thread.Start();}sleep(10);for (auto &thread : threads){thread.Stop();}for (auto &thread : threads){thread.Join();}return 0;
}

相关文章:

线程ID和线程库

在linux中&#xff0c;线程的运行可以用lwp来标识&#xff0c;只是操作系统的标识方法&#xff0c;lwp表示轻量级进程&#xff0c;在Linux中&#xff0c;进程和线程都可以用lwp来标识&#xff0c;而对于用户来说&#xff0c;也有对应的线程ID&#xff0c; 线程库 在linux中&a…...

使用AWS Lambda构建无服务器应用程序

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用AWS Lambda构建无服务器应用程序 AWS Lambda 简介 创建 AWS 账户 创建 Lambda 函数 配置触发器 编写和测试代码 示例代码&am…...

响应式网页设计案例

文章目录 概念核心理念响应式设计的优点实现方法代码案例解释 概念 响应式设计核心理念是一个网站能够根据访问者的设备特性自动调整布局、内容和功能&#xff0c;以提供最佳的用户体验。它依赖于CSS媒体查询、灵活的网格布局和可伸缩的图像&#xff0c;确保网页内容在不同设备…...

麦麦Docker笔记(一)

本文记录如何零基础使用Docker Desktop。 使用操作系统为 macos 15.0.1 相关地址 docker官网 docker hub的镜像地址 下载docker desktop 前往官网下载&#xff0c;我用的macbook&#xff0c;下载的是apple 吸力根版本的&#xff0c;然后拖到application里完成安装&#xff…...

【设计模式系列】总览

努力填完如下表格ing... 设计模式简述详细链接单例模式&#xff08;Singleton&#xff09;工厂方法模式&#xff08;Factory Method&#xff09;简单工厂模式&#xff08;Simple Factory Pattern&#xff09;简单工厂模式是一个静态的工厂类&#xff0c;它提供一个根据参数决定…...

P11118 [ROI 2024 Day 2] 无人机比赛 题解

Description 有 n n n 架无人机参与比赛&#xff0c;第 i i i 架无人机飞过一个单位距离需 t i t_i ti​ 秒。 赛道为一条直线&#xff0c;上面有 m m m 个存档点&#xff0c;第 i i i 个存档点距起点 s i s_i si​ 个单位长度&#xff0c;保证 s i 1 > s i s_{i1…...

时序数据库是什么:概念、特点与分类简析

时序数据与时序数据库的“保姆级”科普&#xff01; 作为将数据价值转化为产能能效的“核心大脑”&#xff0c;数据库的发展依然处于加速期&#xff0c;面向不同数据类型的数据库类型也在不断增加。 在众多细分领域数据库类型中&#xff0c;伴随制造业数字化转型的行业趋势和多…...

大数据上岗.入职.就业面试题

1.海量日志数据,提取出某日访问阿里次数最多的那个IP   首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到ip是32位的,最多有个2^32个ip。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,在找出每个小文件中出现频率…...

2016年7月和8月NASA的气候成像(ATom)-1飞行活动期间测量的黑碳(BC)质量混合比(单位为ng BC / kg空气)

目录 简介 摘要 代码 引用 网址推荐 知识星球 机器学习 简介 ATom: Black Carbon Mass Mixing Ratios from ATom-1 Flights 该数据集提供了在2016年7月和8月NASA的气候成像&#xff08;ATom&#xff09;-1飞行活动期间测量的黑碳&#xff08;BC&#xff09;质量混合比&…...

python opencv3

三、图像预处理2 1、图像滤波 为图像滤波通过滤波器得到另一个图像。也就是加深图像之间的间隙&#xff0c;增强视觉效果&#xff1b;也可以模糊化间隙&#xff0c;造成图像的噪点被抹平。 2、卷积核 在深度学习中&#xff0c;卷积核越大&#xff0c;看到的信息越多&#xff0…...

git原理与上传

言&#xff1a; git是一个软件&#xff0c;gitee/github是一个网站&#xff0c;这里有什么联系吗&#xff1f;我们身为一个程序员不可能不知道github&#xff0c;但是毕竟这是外国的网站&#xff0c;我们不翻墙的情况下&#xff0c;是无法访问的(或者就是太慢了&#xff0c;或…...

LeetCode:633. 平方数之和(Java)

633. 平方数之和 题目描述&#xff1a; 给定一个非负整数 c &#xff0c;你要判断是否存在两个整数 a 和 b&#xff0c;使得 a2 b2 c 。 示例 1&#xff1a; 输入&#xff1a;c 5 输出&#xff1a;true 解释&#xff1a;1 * 1 2 * 2 5示例 2&#xff1a; 输入&#xf…...

linux查看端口状态的命令合集

linux查看端口状态的命令合集 直接使用 netstat 命令 如果你不需要超级用户权限&#xff0c;可以直接运行 netstat 命令&#xff1a; netstat -tuln 使用 ss 命令 ss 是一个更现代的工具&#xff0c;通常不需要超级用户权限就能查看端口信息。你可以尝试使用 ss 命令&#xff…...

幼儿园篮球游戏

题目描述&#xff1a; 幼儿园里有一个放倒的圆桶&#xff0c;它是一个 线性结构&#xff0c;允许在桶的右边将篮球放入&#xff0c;可以在桶的左边和右边将篮球取出。每个篮球有单独的编号&#xff0c;老师可以连续放入一个或多个篮球&#xff0c;小朋友可以在桶左边或右边将篮…...

Android编译环境构建(二)(可用于物理机、虚拟机、容器化Jenkins环境)

文章目录 需求环境要求文件下载Gradle Version:7.5cmdline-tools至此普通物理环境的Android编译环境已部署完毕 部署maven(可选)Jenkins配置Android构建环境 说明&#xff1a; 物理环境&#xff1a;物理机、虚拟机等 容器化环境&#xff1a;docker等 需求 Gradle Version:7.5 …...

Web服务器(实验)

目录 nginx实验1&#xff08;快速建站&#xff09;实验2&#xff08;更换默认网页目录&#xff09;实验3&#xff08;内网穿透花生壳&#xff09;实验4&#xff08;综合nginx&#xff09;实验5&#xff08;基于不同IP的虚拟主机网站&#xff09;实验6&#xff08;基于不同端口号…...

【湖南-常德】《市级信息化建设项目初步设计方案编制规范和支出预算编制标准(试行)》-省市费用标准解读系列05

《市级信息化建设项目初步设计方案编制规范和支出预算编制标准&#xff08;试行&#xff09;》&#xff08;常行审 〔2023〕7号&#xff09;标准是湖南省常德市行政审批服务局、常德市财政局2023年12月29日发布的费用标准&#xff08;了解更多可直接关注我们咨询&#xff09;。…...

微信小程序 https://pcapi-xiaotuxian-front-devtest.itheima.net 不在以下 request 合法域名

微信小程序在调用接口的时候出现以上报错&#xff0c;接口没有问题&#xff0c;是因为小程序自动校验了合法域名 打开本地设置&#xff1a; 勾选不校验合法域名&#xff0c;即可 效果如下&#xff1a;...

vue什么时候渲染旧的VDOM,什么时候渲染新的VDOM

在 Vue 中&#xff0c;决定渲染旧的 VDOM 还是新的 VDOM 的关键在于组件的数据变化和 Vue 的响应式系统。一些常见的情况可以帮助理解这个过程&#xff1a; 1. 渲染新 VDOM 的情况 数据变化&#xff1a;当组件的响应式数据&#xff08;如 data、props 或计算属性&#xff09;发…...

【Qwen2技术报告分析】从模型架构 数据构建和模型评估出发

目录 前言 一、Tokenizer 二、模型结构 dense模型 MoE模型 模型参数设置 三、Pre-Training Pre-Training DATA LONG-CONTEXT TRAINING 四、Post-Training Post-Training DATA 人工数据注释&#xff08;collaborative data annotation&#xff09; 自动数据合成&a…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...