【Linux】線程ID

大致草稿——————————

思維導圖

學習目標

一、線程ID的理解

1.1 引出對tid的理解

我們先來創建一個線程復習一下線程的函數:

pthread_t tid;
// 創建一個線程
pthread_create(&tid, nullptr, threadrun, (void*)"thread-1");
// 打印出新線程的tid
std::cout << "new pthread tid:" << tid << std::endl;
// 進行線程的暫停
pthread_join(tid, nullptr);
// 線程執行的任務函數
void* threadrun(void* args)
{std::string name = static_cast<const char*>(args);while (true){std::cout << name << " is runing, tid:" << pthread_self() << std::endl;sleep(1);}
}
// 將一個數字轉換為十六進制的字符串
std::string ToHEX(pthread_t tid)
{char id[128];snprintf(id, sizeof id, "0x%lx", tid);return id;
}

我們可以通過代碼執行結果和ps -aL來查看這個線程的lwp和線程ID是不同的。?

???????通過上述現象,我們發現這個線程的Iwp,給用戶提供的線程ID是不同的,這個兩個數字不是一個東西,線程ID是由pthread庫自己維護一個值。舉個例子,我們的身份證、學號是由誰給我們發送的,是由管理我們的對象生成的,因此在這個庫中自然也是要對線程的管理。

總結:

  • 線程ID是一個地址
  • pthread庫提供唯一的線程ID,并且對線程進行管理

理解庫:?

???????pthread庫是一個文件,我們自己寫的可執行程序也是一個文件,他們都存放在磁盤中。我們需要將可執行程序加載到內存中,將數據和代碼加載到內存中,CPU區進行調度,在這個客戶可執行程序中,我們如果想要創建線程,需要使用pthread函數,需要將這個pthread庫加載到內存中,映射到進程的地址空間。

庫如何做到對線程進行管理?

線程的局部變量:

在全局變量中,所有的線程都可以看到這個局部變量,如果我們使用__pthread來修飾全局變量,會使所有的線程在對應的線程的局部變量中都有一份gval打印出來的地址也是不一樣的。

線程有一個屬性:棧的大小(pthread_attr_t)

tid是一個虛擬地址,在我們的地址空間中一個線程對應的一個線程控制塊。線程的ID本質是線程控制塊的地址。?

二、對線程的封裝

在學習完對tid的理解后,我們來進行學習對線程的封裝,用類將線程的幾個函數和屬性封裝起來。

// 線程的屬性
std::string _name;
pthread_t _tid;
bool is_running;
func_t _func;
void Excute();mThread(const std::string name, func_t func);: _name(name), _func(func)static void *ThreadRoutine(void *args); ;bool Start();std::string status();void Stop();void Join();std::string Name();~mThread();  

接下來,我們來封裝一下其函數:

2.1.1 構造函數

mThread(const std::string name, func_t func): _name(name), _func(func)
{std::cout << "create " << name << " done" << std::endl;
}

2.1.2?開始函數

void Excute()
{std::cout << _name << " is running" << std::endl;is_running = true;_func(_name);is_running = false;
}// 類內函數隱含的隱藏了this指針
static void *ThreadRoutine(void *args) // 新線程都會執行
{//_func(_name);mThread *self = static_cast<mThread *>(args); // 獲得了我們對應的當前對象self->Excute();return nullptr;
}bool Start()
{int n = ::pthread_create(&_tid, nullptr, ThreadRoutine, this);if (n != 0)return false;return true;
}

2.1.3?暫停函數

void Stop()
{if (is_running){::pthread_cancel(_tid);is_running = false;std::cout << _name << " Stop" <<std::endl;}
}

2.1.4?取消函數

void Join()
{::pthread_join(_tid, nullptr);std::cout << _name << " Join" << std::endl;
}

2.1.5 測試代碼

#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <vector>
#include "Thread.hpp"using namespace Mypthread;void Print(const std::string &name)
{int cnt = 1;while (true){std::cout << "name:" << name << " is runing, cnt:" << cnt++ << std::endl;sleep(1);}
}int main()
{std::vector<mThread> mThreads;for(int i = 0; i < 10; i++){std::string name = "thread-" + std::to_string(i + 1);mThreads.emplace_back(name, Print);sleep(1);}// 統一啟動for(auto& k : mThreads){k.Start();}sleep(10);// 統一停止for(auto& k : mThreads){k.Stop();}// 統一取消for(auto& k : mThreads){k.Join();}return 0;
}// int main()
// {
//     // 線程的開始
//     const std::string name = "thread-1";
//     mThread t(name, Print);
//     // std::cout << "status" << t.status() << std::endl;
//     t.Start();
//     std::cout << t.Name() << " ,status:" << t.status() << std::endl;
//     sleep(10);
//     std::cout << t.Name() << " ,status:" << t.status() << std::endl;//     t.Stop();
//     sleep(1);
//     std::cout << t.Name() << " ,status:" << t.status() << std::endl;//     t.Join();
//     std::cout << t.Name() << " ,status:" << t.status() << std::endl;
//     return 0;
// }

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19988.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二分查找學習:優雅的二分查找——“Leetcode 35. 搜索插入位置”

例題 給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2 示例 2…

怎么花草識別?方法有三種!

怎么花草識別&#xff1f;在這個五彩斑斕的世界里&#xff0c;花草是我們生活中不可或缺的一部分。它們點綴著我們的環境&#xff0c;為我們帶來無盡的美麗與驚喜。然而&#xff0c;面對眾多的花草種類&#xff0c;你是否曾感到困惑和迷茫&#xff0c;不知道如何識別它們&#…

VIO System 丨適用于控制器開發前期的測試系統

VIO綜述 嵌入式軟件的HIL測試需要復雜的測試系統及完整的ECU硬件&#xff0c;這導致通常只能在開發流程的后期階段進行測試。全新推出的低成本解決方案VIO System&#xff0c;使得在開發前期不僅可以進行總線通訊測試&#xff0c;也可以同時進行I/O信號測試。 該系統旨在通過…

用 Vim 打造舒適高效的編程體驗

作為程序員,Vim 無疑是最常使用的編輯器之一。它之所以如此受歡迎,得益于其強大的功能和高度可定制的特性。今天,讓我帶大家一起探索如何通過簡單的 .vimrc 配置,打造一個個性化的 Vim 編程環境。 啟用語法高亮 我們首先要確保 Vim 能夠正確地識別和高亮代碼語法。只需在 .vi…

LabVIEW版本控制

LabVIEW作為一種流行的圖形化編程環境&#xff0c;在軟件開發中廣泛應用。有效地管理版本控制對于確保軟件的可靠性和可維護性至關重要。LabVIEW提供了多種方式來管理VI和應用程序的修訂歷史&#xff0c;以滿足不同規模和復雜度的項目需求。 LabVIEW中的VI修訂歷史 LabVIEW內置…

docker安裝Mysql5.7版本

首先Linux系統已經安裝好了docker應用。 1.搜索鏡像 docker search mysql 2.拉取5.7的鏡像 總之,選starts最多的那個就對了。 docker pull mysql:5.7 ~ docker pull mysql:5.7 5.7: Pulling from library/mysql fc7181108d40: Downloading [============> …

mysql創建數據表----centos7.9

mysql創建數據表 查看存在的表 show tables;我這里還未創建任何表所以是這樣的 如有是這樣 若沒有表需要先創建一個表 CREATE DATABASE tb_your_name&#xff1b;創建字段及屬性 CREATE TABLE tb_laws_regulations (id INT AUTO_INCREMENT PRIMARY KEY, -- 文件唯…

柯橋外貿俄語哪里可以學,零基礎俄語培訓

Де?лать 做 из му?хи 從蒼蠅 слона? 大象 我覺得漢語里有一個很合適的詞來形容&#xff1a; Де?лать из му?хи слона? 就是 小題大做&#xff0c;本來是一件很小的事&#xff0c;卻把它形容成天大的事一樣 Хвтит де?…

【UE5.1 角色練習】10-物體抬升、拋出技能 - part2

目錄 前言 效果 步驟 一、讓物體緩慢的飛向手掌 二、向著鼠標方向發射物體 前言 在上一篇&#xff08;【UE5.1 角色練習】08-物體抬升、拋出技能 - part1&#xff09;的基礎上繼續完成角色將物體吸向手掌&#xff0c;然后通過鼠標點擊的方向來發射物體的功能。 效果 步驟…

c#實現BPM系統網絡傳輸接口,http協議,post

BPM通過http協議實現網絡傳輸&#xff0c;語言使用.net(c#)&#xff0c;在這里只提供一個接口&#xff0c;具體代碼如下,請參照&#xff1a; public string MakeRequest(string parameters) { ServicePointManager.ServerCertificateValidationCallback new Syst…

代碼隨想錄算法訓練營第三十二 | ● 122.買賣股票的最佳時機II ● 55. 跳躍游戲 ● 45.跳躍游戲II

122.買賣股票的最佳時機II 講解鏈接&#xff1a;https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html 簡單思路&#xff1a;逐個計算連續兩天的股票差值&#xff0c;sum初始為零&…

Spring Task 定時任務

文章目錄 Spring Task 定時任務pom 包配置啟動類開啟定時創建定時任務實現類定時任務 1:定時任務 2: 參數說明fixedRate 說明cron 說明 并行任務 Spring Task 定時任務 在項目開發中&#xff0c;經常需要定時任務來幫助我們來做一些內容&#xff0c;比如定時派息、跑批對賬、業…

【并查集】專題練習

題目列表 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 模板 836. 合并集合 - AcWing題庫 #include<bits/stdc.h> using lllong long; //#define int ll const int N1e510,mod1e97; int n,m; int p[N],sz[N]; int find(int a) {if(p[a]!a) p[a]find(p[a]);return p[a…

第十八講:聯合和枚舉

第十八講&#xff1a;聯合和枚舉 1.聯合體&#xff08;共用體&#xff09;1.1聯合體的聲明1.2聯合體大小的計算1.3聯合體的特點1.4聯合體的使用1.4.1聯合體的直接使用1.4.2聯合體直接使用的優化方法1.4.3聯合體成員中含有數組的使用1.4.4使用聯合體判斷當前機器是大端排序&…

K8s(Kubernetes)常用命令

大家好&#xff0c;當談及容器編排工具時&#xff0c;Kubernetes&#xff08;常簡稱為K8s&#xff09;無疑是當今最受歡迎和廣泛使用的解決方案之一。作為一個開源的容器編排平臺&#xff0c;Kubernetes 提供了豐富的功能&#xff0c;可以幫助開發人員和運維團隊管理、部署和擴…

電商分析@電商數據與運營優化

電商數據分析與運營優化是指通過對電商平臺的各種數據進行深入分析&#xff0c;以發現潛在的問題和機會&#xff0c;并采取相應的優化措施&#xff0c;提高電商運營效率和盈利能力。 首先&#xff0c;電商數據分析需要收集和整理各類數據&#xff0c;包括銷售數據、用戶數據、流…

大宋咨詢(深圳車主滿意度調查)如何開展汽車展會觀眾滿意度問卷調查

汽車展覽是由政府機構、專業協會或主流媒體等組織,在專業展館或會場中心進行的汽車產品展示展銷會或汽車行業經貿交易會、博覽會等活動。汽車展覽通過對汽車工藝的呈現與汽車產品的廣告,為消費者提供汽車制造工業與汽車產品的發展動向。同時,汽車廠商可通過汽車展覽對外宣傳產品…

實戰16:基于apriori關聯挖掘FP-growth算法挖掘關聯規則的手機銷售分析-代碼+數據

直接看視頻演示: 基于apriori關聯挖掘關聯規則的手機銷售分析與優化策略 直接看結果: 這是數據展示: 挖掘結果展示: 數據分析展示:

利用WK2168實現串口服務器

ESP32 SPI與WK2168實現串口服務器 概述系統組成代碼概述 一些老設備通過RS485采集數據,如果在一個系統中采用幾個RS485設備可能是一個不錯的選擇,但要是使用46個RS485數據采集設備為一個PLC提供外部數據,系統的性能就很難有保障了。通過一個串口服務器實現看來是一個好的選…

智慧校園有哪些特征

隨著科技的飛速進步&#xff0c;教育領域正經歷著一場深刻的變革。智慧校園&#xff0c;作為這場變革的前沿代表&#xff0c;正在逐步重塑我們的教育理念和實踐方式。它不僅僅是一個概念&#xff0c;而是一個集成了物聯網、大數據、人工智能等先進技術的綜合生態系統&#xff0…