Linux系統編程 | 線程的基本概念

💓個人主頁:mooridy
💓專欄地址:Linux
關注我🌹,和我一起學習更多計算機的知識!

🔝🔝🔝

什么是線程

程序中的一個執行路線就叫做線程

  • 一個進程至少要有一個執行線程,單個進程本身就是一個執行流,所以單個進程某種意義上也是一個線程(是主線程).線程在進程內部運行,本質是在進程地址空間內運行
  • 在Linux操作系統下,線程就是輕量化進程,線程是沒有獨立的地址空間的PCN結構,線程的資源是主線程共享給它們的。
    ![[Pasted image 20250325104542.png]]

線程的優點

? 線程的創建時間比進程快
因為進程在創建的過程中,還需要資源管理信息,比如內存管理信息、文件管理信息,而線程在創建的過程中,不會涉及這些資源管理信息,而是共享它們;

? 同一個進程內的線程切換比進程切換快
因為線程具有相同的地址空間(虛擬內存共享),這意味著同一個進程的線程都具有同一個頁表,同一個虛擬地址空間,那么在切換的時候不需要切換頁表。同時也不會擾亂處理器的緩存機制。
? 線程之間的數據交互效率更高
由于同一進程的各線程間共享內存和文件資源,那么在線程之間數據傳遞的時候,就不需要經過內核了;

線程異常

線程是進程的執?分?,線程出異常,就類似進程出異常,進?觸發信號機制,會終?整個進程,該進程內的所有線程也就隨即退出。

線程與進程的比較

? 進程資源分配的單位,線程CPU 調度的單位;
? 進程擁有一個完整的資源平臺,而線程只獨享必不可少的資源,如寄存器和棧、線程ID、信號屏蔽字、調度優先級

進程的多個線程共享

同?地址空間,因此Text SegmentData Segment都是共享的,如果定義?個函數,在各線程中都可以調?,如果定義?個全局變量,在各線程中都可以訪問到,除此之外,各線程還共享以下進程資源和環境:
?件描述符表、每種信號的處理?式(SIG_ IGN、SIG_ DFL或者?定義的信號處理函數)、當前?作?錄、用戶id和組id

主線程的PID和LWP相同,CPU調度時是在看LWP,而不是PID,線程的PID和主線程相同,自己獨有LWP

Linux線程控制

POSIX線程庫

由于pthred是第三方庫
所以編譯時要加上-lpthread的字段

如何創建線程
功能:創建?個新的線程原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);參數:thread:返回線程IDattr:設置線程的屬性,attr為NULL表?使?默認屬性start_routine:是個函數地址,線程啟動后要執?的函數arg:傳給線程啟動函數的參數返回值:成功返回0;失敗返回錯誤碼
如何終止線程
  1. 從線程函數return。這種?法對主線程不適?,從main函數return相當于調?exit。(大多數情況)

  2. 線程可以調?pthread_ exit終???。

功能:線程終?
原型:void pthread_exit(void *value_ptr);參數:value_ptr: 指向退出狀態的指針,可傳遞任意類型數據value_ptr不要指向?個局部變量。
返回值:?返回值,跟進程?樣,線程結束的時候?法返回到它的調?者(??)
  1. ?個線程可以調?pthread_ cancel終?同?進程中的另?個線程。
功能:取消?個執?中的線程原型:int pthread_cancel(pthread_t thread);參數:thread:線程ID返回值:成功返回0;失敗返回錯誤碼
如何進行線程等待
功能:等待線程結束原型int pthread_join(pthread_t thread, void **value_ptr);參數:thread:線程IDvalue_ptr:它指向?個指針,后者指向線程的返回值返回值:成功返回0;失敗返回錯誤碼

假如不進行線程等待,可能會出現類似于僵尸進程的問題

調?該函數的線程將掛起等待,直到id為thread的線程終?。

如何進行線程分離
  • 默認情況下,新創建的線程是joinable的,線程退出后,需要對其進?pthread_join操作,否則?法釋放資源,從?造成系統泄漏。
  • 如果不關?線程的返回值,join是?種負擔,這個時候,我們可以告訴系統,當線程退出時,?動釋放線程資源。
int pthread_detach(pthread_t thread);

pthread_self()函數可以返回當前線程的線程ID,所以假設我們想要當前線程與主線程脫離關系,可以這樣寫: ```

pthread_detach(pthread_self());

線程ID本質

首先,pthread_create的返回值是線程ID.
線程ID的本質是一個地址,pthread庫是一個動態庫,是第三方庫,這個庫會被映射到進程的地址空間的共享區中,而線程ID所指的地址則是pthread這個庫層面上,線程集合的起始地址
![[Pasted image 20250327113215.png]]

線程棧
  • 這種stack不能動態增?,?旦?盡就沒了,這是和?成進程的fork不同的地?。
  • 對于?線程的 stack ,它其實是在進程的地址空間中map出來的?塊內存區域,原則上是線程私有的,但是同?個進程的所有線程?成的時候,是會淺拷??成者的 task_struct 的很多字段,如果愿意,其它線程也還是可以訪問到的,于是?定要注意。

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

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

相關文章

小林coding-12道Spring面試題

1.說一下你對 Spring 的理解?spring的核心思想說說你的理解? 2.Spring IoC和AOP 介紹一下?Spring的aop介紹一下?IOC和AOP是通過什么機制來實現的?怎么理解SpringIoc?依賴倒置,依賴注入,控制反轉分別是什么?依賴注…

第十二章——位運算

按位的與& 若x的第i位和y的第i位都是1,那么(x&y)1,否則(x&y) 0 應用:希望讓某一位或某些位為0 。取一個數中的一段。 按位的或| 若x的第i位1或y的第i位1,那么&…

計算機等級考試數據庫三級(筆記3)

插入 修改 現要創建一個具有如下功能的觸發器:每當在銷售表中插入一條銷售記錄時,修改商品表中對應商品的銷售總量,假設一次只插入一條銷售記錄。請補全下列代碼。CREATE TRIGGER tri insert on xx FOR xx AS xx 商品表 xx 銷售總量xx (SELEC…

【Leetcode 每日一題】2716. 最小化字符串長度

問題背景 給你一個下標從 0 0 0 開始的字符串 s s s,重復執行下述操作 任意 次: 在字符串中選出一個下標 i i i,并使 c c c 為字符串下標 i i i 處的字符。并在 i i i 左側(如果有)和 右側(如果有&…

Flutter中實現拍照識題的功能

文章目錄 **1. 功能拆解****2. 具體實現步驟****(1) 拍照或選擇圖片****(2) 圖片預處理(可選)****(3) 文字識別(OCR)****(4) 數學公式識別 → LaTeX****方案1:Mathpix API(高精度,付費&#xff…

【Mysql:內置函數】

日期函數: 查看當前日期: select current_date();查看當前時間: select current_time(); 查看當前時間戳: select current_timestamp(); 計算兩個日期的差值: select datediff(date1,date2); 當前的日期時間&a…

71. 我的第一個Linux驅動實驗

一、字符設備驅動框架 字符設備驅動的編寫主要就是驅動對應的open、close、read。。。其實就是 file_operations結構體的成員變量的實現。 其中關于 C 庫以及如何通過系統調用“陷入” 到內核空間這個我們不用去管,我們重點關注的是應用程序和具體的驅動&#xff0…

jdk21使用Vosk實現語音文字轉換,免費的語音識別

1.下載vosk的model vosk官網&#xff1a;https://alphacephei.com/vosk/models 我這里使用較小的vosk-model-small-cn-0.22 2.添加相關pom文件 <!-- 獲取音頻信息 --><dependency><groupId>org</groupId><artifactId>jaudiotagger</artifac…

如何一鍵安裝所有Python項目的依賴!

在開發項目時&#xff0c;常常需要在多個環境中安裝各種依賴。對開發者來說&#xff0c;每次手動一個個安裝這些依賴是不是很麻煩&#xff1f;&#x1f605; 其實有個超簡單的辦法&#xff01;只需要一個腳本&#xff0c;就能快速解決問題&#xff01;&#x1f4a1; 這就是我們…

Blender配置渲染設置并輸出動畫

在Blender中&#xff0c;渲染設置和渲染動畫的選項位于不同的面板中。以下是具體步驟&#xff1a; 渲染設置 渲染設置用于配置輸出格式、分辨率、幀率等參數。 打開右側的 屬性面板&#xff08;按 N 鍵可切換顯示&#xff09;。 點擊 “輸出屬性” 選項卡&#xff08;圖標是…

C++修煉:string類的使用

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》、《C修煉之路》 歡迎點贊&#xff0c;關注&am…

【go微服務】如何快速掌握grpc開發

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

【區塊鏈 + 文化版權】基于 FISCO BCOS 的方言大數據語料庫 | FISCO BCOS 應用案例

蘇州喵自在區塊鏈科技有限公司打造的基于FISCO BCOS 的粵語大數據語料庫&#xff0c; 旨在利用區塊鏈技術保護和發展粵語文化遺產。該項目利用區塊鏈的不可篡改性、分布式存儲、智能合約和激勵機制等特性&#xff0c; 為保護非物質文化遺產&#xff0c; 加強粵語研究與教育和開…

大模型在支氣管擴張預測及治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與方法 1.3 國內外研究現狀 二、大模型技術概述 2.1 大模型的基本原理與架構 2.2 適用于支氣管擴張預測的大模型類型及特點 2.3 大模型在醫療領域的應用現狀與優勢 三、支氣管擴張的相關醫學知識 3.1 支氣管擴張的病因…

亞馬遜云科技提供完全托管的DeepSeek-R1模型

近日&#xff0c;亞馬遜云科技宣布在Amazon Bedrock上線完全托管的DeepSeek-R1模型。DeepSeek是首個登陸Amazon Bedrock的國產大模型&#xff0c;自今年1月底推出以來&#xff0c;已有數千客戶使用Amazon Bedrock的自定義模型導入功能部署了DeepSeek-R1模型。 DeepSeek在過去幾…

二叉樹、排序算法與結構圖

二叉樹、排序算法與數據庫 二叉樹 二叉樹的性質 節點數與深度的關系&#xff1a;深度為 k k k的二叉樹&#xff0c;最多有 2 k ? 1 2^k - 1 2k?1個節點。例如&#xff0c;深度為 3 3 3的二叉樹&#xff0c;最多有 2 3 ? 1 7 2^3 - 1 7 23?17個節點。葉子節點與度為2節…

vmwaretools解壓失敗|vmware tools distrib cannot mkdir read only file system|bug匯總

最簡單的一條路線&#xff1a;你的解壓命令用sudo了嗎&#xff1f; 這個方法不能解決的話就看下面內容。本文提供給你全過程思路。 如需轉載&#xff0c;標記出處 背景&#xff1a; 之前虛擬機和主機的復制黏貼還能用&#xff0c;今天突然用不了&#xff0c;重新下載安裝包&am…

jEasyUI 創建自定義視圖

jEasyUI 創建自定義視圖 引言 jEasyUI 是一款流行的 jQuery UI 組件庫&#xff0c;它提供了豐富的 UI 組件和交互效果&#xff0c;極大地簡化了 Web 開發的復雜度。在 jEasyUI 中&#xff0c;我們可以通過自定義視圖來擴展其功能&#xff0c;滿足特定的業務需求。本文將詳細介…

Spring MVC配置詳解:從歷史到實戰

文章目錄 一、Java Web的發展歷程1.Model I與Model II開發模式&#xff08;1&#xff09; Model I開發模式&#xff08;2&#xff09;Model II開發模式 2.MVC設計模式Spring MVC本質MVC工作流程 二、Spring MVC快速入門實戰1.環境搭建步驟&#xff08;1&#xff09;創建Maven W…

老是忘記package.json,備忘一下 webpack 環境下 Vue Cli 和 Vite 命令行工具對比

Vue 2.X webpack 環境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…