深入了解linux系統—— 線程封裝

C++11線程庫

C++11也提供了對應的線程庫,在頭文件<thread>中;C++11將其封裝成thread類,通過類實例化出對象,調用類內成員方法進行線程控制。

#include <iostream>
#include <thread>
#include <unistd.h>
using namespace std;
void func()
{int cnt = 3;while(cnt--){cout<<"thread : "<<cnt<<endl;sleep(1); }
}
int main()
{thread td(func);//創建線程sleep(5);td.detach();//線程分離td.join();//線程等待return 0;
}

線程封裝

C++11實現的線程thread是對pthread庫的封裝,這里也對pthread庫做簡單封裝;

首先要封裝實現一個thread類,其中要包括成員變量:線程ID、分離狀態(detach)、運行狀態(runing)、返回值、線程名稱等等

namespace mypthread
{class thread{public:private:pthread_t _tid;std::string _name;bool _detach;bool _runing;void* retval;};
}

構造函數(創建線程)

C++thread一樣,在創建對象時就將線程要執行的方法傳入,那在thread類中,就要存在一個成員變量func(沒有參數、沒有返回值的)

這里就要使用C++11語法:function包裝器

using func = std::function<void(void)>;這樣在類內定義void(void)類型的成員變量。

但是,我們知道,在調用pthread_create創建線程時,要傳遞的函數類型是(void*(void*))類型的,所以就還要存在一個void*(void*)類型的函數;我們可以將該方法實現成靜態成員函數

但是,這個函數還要可以訪問thread類內成員func,靜態成員函數沒有隱藏的this指針,這里可以將this作為參數傳遞給線程要調用的方法(pthread_create第四個參數)

namespace mypthread
{static int count = 1;using func = std::function<void(void)>;class thread{static void *routine(void *msg){// 傳遞的是this指針thread *td = static_cast<thread *>(msg);std::cout << td->_name << std::endl;// 調用funtd->_fun();return (void *)100;}public:thread(func fun) : retval(nullptr), _fun(fun), _detach(false){_name = "thread-" + std::to_string(count);count++;int n = pthread_create(&_tid, nullptr, routine, (void *)this);if (n != 0){std::cerr << "pthread_create" << std::endl;}_runing = true;}private:pthread_t _tid;std::string _name;bool _detach;bool _runing;void *retval;func _fun;};
}

這里為了方便測試,存在一個count計數器,為了生成線程名稱_name

線程分離

在創建線程之后,我們可以設置線程分離;

        void Detach(){if(_detach)return;pthread_detach(_tid);_deatch = true;}

線程取消

我們可以調用pthread_cancel來取消線程;

        bool Cancel(){if (_runing == false)return;int n = pthread_cancel(_tid);if (n != 0){std::cerr << "pthread_cancel" << std :: endl;return false;}return true;}

線程等待

新創建的線程在運行結束后,需要進行線程等待;這里實現就直接調用pthread_join阻塞等待線程;然后將線程的返回值放到_retval中。

      void Join(){pthread_join(_tid, &_retval);}

析構函數(回收線程)

pthread庫進行面向對象封裝,在thread析構函數中,就要調用線程取消Cancel,然后調用Join回收線程并獲取線程的返回值。

        ~thread(){Cancel();Join();}

測試thread

using namespace mypthread;
void test()
{int cnt = 3;while (cnt--){std::cout << "new thread : " << cnt << std::endl;sleep(1);}
}
int main()
{thread td(test);sleep(5);return 0;
}

在這里插入圖片描述

這樣在main函數中,就算我們沒有顯示調用Join等待,在線程thread對象出了作用域后,自動調用析構函數從而調用CancelJoin回收線程。

番外

對于線程封裝,這里實現了另外一種版本:

在創建thread對象之后并不會立即創建新線程,而是調用Start才會創建新線程;

此外我們可以在沒有創建線程時設置detach分離狀態,也可以在線程運行時設置detach分離狀態;

namespace mythread
{static int count = 1;using func_t = std::function<void()>;class Thread{static void *rontinue(void *args){Thread *pt = static_cast<Thread *>(args);pt->_fun();return (void*)pt->_name.c_str();}void EnableDetach() { _detach = true; }void EnableRuning() { _runing = true; }public:Thread(func_t fun) : _tid(-1), _detach(false), _runing(false), _fun(fun), _retval(nullptr){_name = "thread- " + std::to_string(count);count++;}void Start(){if (_runing)return;// 創建線程int n = pthread_create(&_tid, nullptr, rontinue, this);if (n != 0){std::cerr << "pthread_create" << std::endl;exit(1);}EnableRuning();Detach();}void Detach(){if (_detach){if (_runing){pthread_detach(_tid);}EnableDetach();}}void Cancel(){if (_runing){pthread_cancel(_tid);}_runing = false;}void Join(){if (_detach)return;pthread_join(_tid, &_retval);}std::string GetName(){return _name;}private:pthread_t _tid;    // 線程idstd::string _name; // 線程名bool _detach;      // 分離狀態bool _runing;      // 運行狀態func_t _fun;         // 線程執行函數void *_retval;     // 返回值};
}

簡單總結:

本篇文章對pthread庫做了簡單封裝,實現了簡單的thread類。

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

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

相關文章

安全防御-SCDN如何保護網站安全

隨著互聯網的快速發展&#xff0c;越來越多的企業依賴在線服務來運行其核心業務。與此同時&#xff0c;網絡攻擊的頻率和復雜性也在不斷增加&#xff0c;惡意流量成為許多企業頭疼的問題。為了有效地提高網站的安全性和穩定性&#xff0c;德迅云安全加速SCDN被許多用戶關注。今…

運籌優化(OR)-在機器學習(ML)浪潮中何去何從?

在如今機器學習的浪潮中&#xff0c;機器學習相關的崗位日益增多&#xff0c;而運籌優化的崗位卻相對較少。這是今年我秋招過程中看到的現象。企業越來越希望候選人不僅能建模求解&#xff0c;還能理解如何用數據驅動優化。需要我們有一個完整的技術棧。那么我們就來看看OR與ML…

GitHub Copilot 在 VS Code 上的終極中文指南:從安裝到高階玩法

GitHub Copilot 在 VS Code 上的終極中文指南&#xff1a;從安裝到高階玩法 前言 GitHub Copilot 作為 AI 編程助手&#xff0c;正在徹底改變開發者的編碼體驗。本文將針對中文開發者&#xff0c;深度解析如何在 VS Code 中高效使用 Copilot&#xff0c;涵蓋基礎設置、中文優化…

安全測試、web探測、httpx

&#x1f4a2; 簡介 httpx 是一個快速且多用途的HTTP工具包&#xff0c;允許使用retryablehttp庫運行多個探測器。它旨在通過增加線程數量來保持結果的可靠性。 功能 &#x1f92a; 發送 GET、POST、PUT、DELETE 等 HTTP 請求支持流式傳輸支持重定向支持身份驗證支持代理支持 …

CNN 中 3×3 卷積核等設計背后的底層邏輯

為什么卷積核愛用 33&#xff1f;CNN 設計 “約定俗成” 的底層邏輯 做深度學習的同學&#xff0c;對 CNN 里 33 卷積核、最大池化、BN 層這些設計肯定不陌生&#xff0c;但你有沒有想過&#xff1a;為啥卷積核總選 33&#xff1f;池化層為啥默認最大池化&#xff1f;BN 層又是…

稅務崗位職場能力解析與提升路徑規劃

稅務崗位作為企業運營的核心環節之一&#xff0c;對從業者的專業能力與綜合素質要求極高。從基礎稅務核算到戰略稅務籌劃&#xff0c;職場能力的提升需要系統化的路徑規劃。以下從核心能力、階段化提升路徑及證書價值三個維度展開分析。核心能力體系構建專業稅務能力是基礎&…

MySQL 索引:結構、對比與操作實踐指南

MySQL系列 文章目錄MySQL系列前言案例一、認識MySQL與磁盤1.1 MySQL與存儲1.2 MySQL 與磁盤交互基本單位二、 MySQL 數據交互核心&#xff1a;BufferPool 與 IO 優化機制三、索引的理解3.1 測試案例3.2 page3.3 頁目錄3.3 對比其他結構四、聚簇索引 VS 非聚簇索引五、索引操作5…

GitHub 熱榜項目 - 日榜(2025-08-24)

GitHub 熱榜項目 - 日榜(2025-08-24) 生成于&#xff1a;2025-08-24 統計摘要 共發現熱門項目&#xff1a;20 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術熱點&#xff1a;1&#xff09;AI應用爆發式創新&#xff0c;包括神經擬真伴侶&#…

純凈Win11游戲系統|24H2專業工作站版,預裝運行庫,無捆綁,開機快,游戲兼容性超強!

哈嘍&#xff0c;大家好&#xff01; 今天給大家帶來一款 Windows 11 游戲版本系統鏡像&#xff0c;軟件已放在文章末尾&#xff0c;記得獲取。 一、軟件獲取與啟動 解壓后雙擊exe即可直接運行&#xff0c;無需額外安裝。首次啟動界面簡潔&#xff0c;引導清晰。 二、系統選…

CI/CD 學習之路

目錄 簡介&#xff1a; 1、工具介紹&#xff1a; 2、搭建jenkins 1&#xff09;創建一個文件Dockerfile&#xff0c;文件無后綴&#xff0c;寫入以下代碼 2&#xff09;在Dockerfile文件所在目錄執行&#xff08;my-jenkins-android 未自定義鏡像名稱&#xff09; 3&#xf…

馬斯克宣布開源Grok 2.5:非商業許可引爭議,模型需8×40GB GPU運行,Grok 3半年后開源

昨晚&#xff0c;馬斯克在 X 平臺連續發布多條消息&#xff0c;宣布其人工智能公司 xAI 已正式開源 Grok 2.5 模型。這款模型是 xAI 在 2024 年的主力模型&#xff0c;如今完全向公眾開放。與此同時&#xff0c;馬斯克還預告了下一代模型 Grok 3 的開源計劃&#xff0c;預計將在…

DMP-Net:面向腦組織術中成像的深度語義先驗壓縮光譜重建方法|文獻速遞-深度學習人工智能醫療圖像

Title題目DMP-Net: Deep semantic prior compressed spectral reconstruction methodtowards intraoperative imaging of brain tissueDMP-Net&#xff1a;面向腦組織術中成像的深度語義先驗壓縮光譜重建方法01文獻速遞介紹腦腫瘤可分為原發性和繼發性兩類。原發性腦腫瘤多發生…

【nl2sql綜述】2025最新綜述解讀

論文地址&#xff1a;https://arxiv.org/pdf/2408.05109 解讀&#xff1a;邁向數據民主化——大型語言模型時代下的Text-to-SQL技術綜述 近期&#xff0c;一篇名為《A Survey of Text-to-SQL in the Era of LLMs》的綜述論文系統性地梳理了自然語言到SQL查詢&#xff08;Text-t…

logback-spring.xml 文件

一.概述這是一個日志文件&#xff0c;主要用來對應用程序的日志進行記錄&#xff0c;并且可以配置日志的一些格式和規則。二.讀取機制1.SpingBoot自動識別進行文件掃描時&#xff0c;當在 classpath 下發現名為 logback-spring.xml 的文件時&#xff0c;Spring Boot 會自動加載…

LeetCode Hot 100 第二天

1. 283 移動零 鏈接&#xff1a;題目鏈接 題解&#xff1a; 要求&#xff1a;時間復雜度 < O (n^2) 題解&#xff1a;將非零元素依次往前移&#xff08;占據0元素的位置&#xff09;&#xff0c;最后再將0元素填充至數組尾。時間復雜度O(n)&#xff0c;用一個指針x來維護非…

04-Maven工具介紹

文章目錄1、Maven官網2、Maven的3個重要功能3、Maven安裝3.1 安裝教程的視頻3.2 安裝教程的文本1、Maven官網 https://maven.apache.org/ 2、Maven的3個重要功能 黑馬程序員JavaWeb基礎教程&#xff0c;Java web從入門到企業實戰完整版 3、Maven安裝 3.1 安裝教程的視頻 …

基于開源 AI 智能名片鏈動 2+1 模式 S2B2C 商城小程序的新開非連鎖品牌店開業引流策略研究

摘要&#xff1a;本文聚焦于一家新開且地理位置優越、目標客戶為周邊“80 后”“90 后”上班族的非連鎖品牌店。在明確店鋪定位、完成店內設計與菜品規劃等基礎工作后&#xff0c;探討如何在新店開業初期有效打響品牌、吸引目標客戶。通過引入開源 AI 智能名片鏈動 21 模式 S2B…

UE5多人MOBA+GAS 54、用戶登錄和會話創建請求

文章目錄創建主菜單需要的創建主菜單游戲模式創建主菜單游戲控制器創建主菜單界面UI實現登錄游戲實例創建等待界面配置和獲取協調器 URL撰寫和發送會話創建請求創建主菜單需要的 創建主菜單游戲模式 MainMenuGameMode 創建主菜單游戲控制器 MainMenuPlayerController #p…

SCSS上傳圖片占位區域樣式

_App.scss// 上傳圖片占位區域樣式---------------------------------------- [theme"uploadImage"] {transition: 0.2s;position: relative;cursor: pointer;border-radius: 4px;/*居中填滿*/background-repeat: no-repeat;background-position: center;background-…

Prometheus+Grafana監控mysql

1、簡述 使用 Prometheus 結合 Grafana 監控 MySQL 是一套成熟且廣泛應用的方案&#xff0c;能實現對 MySQL 性能、狀態等指標的實時采集、存儲、可視化及告警。 2、整體架構說明 Prometheus&#xff1a;負責定時從 MySQL 采集監控指標&#xff08;需借助 Exporter&#xff0…