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

Linux线程id与简易封装线程实现

线程id

我们发现,线程有个tid和LWP;tid是给用户提供的,是pthread库自己维护的,LWP是内核的,不需要呈现给用户。

站在用户角度上,我们需要的是线程的id,库对线程进行管理,因此会开辟一个内存块(类似大号结构体),tid是一个地址,未来管理线程只要找到线程控制块地址就行(tid)。

线程栈大小是可以调整的,线程属性源码:

typedef struct {int detachstate;   // 线程分离状态 (PTHREAD_CREATE_JOINABLE/DETACHED)int schedpolicy;   // 调度策略 (SCHED_FIFO/SCHED_RR/SCHED_OTHER)struct sched_param schedparam; // 调度参数int inheritsched;  // 继承属性 (PTHREAD_INHERIT_SCHED/PTHREAD_EXPLICIT_SCHED)int scope;         // 竞争范围 (PTHREAD_SCOPE_SYSTEM/PTHREAD_SCOPE_PROCESS)size_t guardsize;  // 栈保护区域大小void* stackaddr;   // 用户指定的栈地址size_t stacksize;  // 栈大小
} pthread_attr_t;

linux线程=pthread库中线程属性集+LWP(1:1)

创建轻量级进程:

默认共享地址空间,pthread库就封装了该系统调用,线程属性集合的其实虚拟地址在pthread库中维护。

如果想要全局变量每个线程都私有一份,在变量声明前加__thread(两个_),只在linux中有效,只能修饰内置类型(局部存储)。

简易封装线程库的实现

#pragma 
#include<pthread.h>
#include<iostream>
typedef void (*func_t)();
class Thread
{
public:Thread(std::string name,func_t func){this->name = name;this->func = func;}void Excute(){is_running = true;func();}std::string Status(){if(is_running)return "running";elsereturn "sleep";}static void* ThreadRoutime(void* args){Thread *self = static_cast<Thread *>(args);self->Excute();return nullptr;}bool Start(){int n=::pthread_create(&tid, nullptr, ThreadRoutime, this);if(n!=0)return false;elsereturn true;}void Stop(){if(is_running){is_running = false;::pthread_cancel(tid);}}void Join(){if(is_running){::pthread_join(tid, nullptr);}}~Thread(){Stop();}private:std::string name;pthread_t tid;bool is_running;func_t func;
};

使用案例:

#include"Thread.hpp"
#include<iostream>
#include<unistd.h>
using namespace std;
void Run()
{sleep(1);while (1){cout << "this is a thread"<<endl;sleep(1);}
}
int main()
{Thread t("syx", Run);t.Start();cout << t.Status() << endl;sleep(5);t.Stop();cout << t.Status()<<endl;t.Join();return 0;
}


文章转载自:

http://ohKsz6w9.wwthz.cn
http://0f4l3ouZ.wwthz.cn
http://Y1X4JHMm.wwthz.cn
http://Fn2QV9lA.wwthz.cn
http://2iycro0s.wwthz.cn
http://QOsndIzY.wwthz.cn
http://oRYqIIQb.wwthz.cn
http://k7rfPE6t.wwthz.cn
http://Zs0pFdQI.wwthz.cn
http://U0xygXMk.wwthz.cn
http://M1nHPXMH.wwthz.cn
http://1C9poIiC.wwthz.cn
http://VgGUIb56.wwthz.cn
http://GC037QqD.wwthz.cn
http://XgmrgNxZ.wwthz.cn
http://4mTbsSDF.wwthz.cn
http://CAjTloL3.wwthz.cn
http://YUDbdLYF.wwthz.cn
http://JL6BB2qQ.wwthz.cn
http://BVIf3bX1.wwthz.cn
http://1mvDvAof.wwthz.cn
http://qtbzHEQs.wwthz.cn
http://sNZ3WyWA.wwthz.cn
http://5fXCQ21x.wwthz.cn
http://SRUvsq82.wwthz.cn
http://M6lgPbcz.wwthz.cn
http://JyxJAHvO.wwthz.cn
http://vwdnf6w1.wwthz.cn
http://AiVZWHcF.wwthz.cn
http://BWivMxEM.wwthz.cn
http://www.dtcms.com/a/383084.html

相关文章:

  • 公链分析报告 - Secret Network
  • JavaScript 简单链表题目试析
  • 【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置
  • 电商AI导购系统的模型部署架构:TensorFlow Serving在实时推荐中的实践
  • 光射三缝实验
  • K8s部署 Redis 主从集群
  • Android点击桌面图库应用启动流程trace分析
  • 【抗量子安全】全球视角下 PQC 与 QKD 技术洞察:政策引领与产业演进
  • 代码随想录学习摘抄day9(回溯1-11)
  • 数据处理指令
  • SpringBoot 中 ZK 与 Kafka 节点选择逻辑:底层原理与实践解析
  • 事务与mysql数据库锁的关系
  • 继承类模板:函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到
  • 07-Redis 基础操作全攻略:从键管理到数据类型判断
  • 【linux】特殊权限
  • [数据结构] 排序
  • Python网络与多任务编程:TCP/UDP实战指南
  • Elasticsearch面试精讲 Day 17:查询性能调优实践
  • Go-zero 构建 RPC 与 API 服务全流程
  • CRI容器运行时接口
  • 《Python 自动化表单填写全攻略:从基础操作到实战案例》
  • 黑马程序员JVM基础学习笔记
  • 驰骋低代码BPM开发平台的组成部分
  • ubuntu22.04源码安装ffmpeg-4.4
  • 黑马Java进阶教程,全面剖析Java多线程编程,并发和并行,笔记02
  • 大数据毕业设计选题推荐-基于大数据的教育与职业成功关系可视化分析系统-Spark-Hadoop-Bigdata
  • Ubuntu Server 安装图形界面和通过Window远程桌面连接服务器(Xrdp)
  • 贪心算法在云计算虚拟机部署问题中的应用
  • macOS中找不到钥匙串访问
  • 基于FPGA实现LeNet-5(经典CNN识别手写数字)推理