Linux -- 線程的優點、pthread 線程庫

目錄

線程的優點

pthread 線程庫?

前言

認識線程庫

簡單驗證線程的獨立棧空間


線程的優點

與進程之間的切換相比,線程之間的切換需要操作系統做的工作要少得多。

調度進程時,CPU 中有一個 cache(緩存,提高運行效率),CPU在虛擬地址轉物理地址后,在內存中找到了一行代碼,然而程序在運行時,比如運行到了第50行代碼,下一次大概率會運行下一行代碼,也就是第51行代碼,也有可能跳轉到其他代碼,但是大概率還是運行下一行代碼,所以系統把第50行代碼的周邊代碼都加載到 cache 中,CPU 在運行時直接從 cache 中讀取代碼,提高 CPU 尋址效率。

進程切換時,會把當前緩存到 cache 的數據都切換掉,而線程切換時,寄存器中的數據會被切換,但 cache 中的數據不會被丟棄,大概率還是可以用的,線程切換只需要更改少量寄存器和棧指針等信息,而不需要像進程那樣進行完整的上下文切換。所以線程切換時操作系統做的工作比進程的切換少。

創建一個新線程的代價要比創建一個新進程小得多,線程占用的資源比進程少得多。

進程是資源分配的基本單位,線程是調度的基本單位,當多個線程屬于同一個進程時,它們會共享以下資源:

  1. 地址空間:包括代碼段、數據段、堆區和棧區(每個線程有自己的棧)。所有線程都可以訪問進程的整個虛擬地址空間,這意味著它們可以讀寫相同的全局變量和靜態變量。

  2. 打開的文件描述符:如文件、網絡連接等。所有線程都能操作這些描述符,因此對文件或網絡連接的操作可以在不同線程間共享。

  3. 環境變量:進程啟動時設置的環境變量是所有線程共有的。

  4. 內存映射:如果進程使用了內存映射文件或其他形式的內存映射,那么這些映射也是所有線程可見并可訪問的。

  5. 信號處理程序:雖然信號通常是針對整個進程的,但某些信號(如SIGSEGV)可以由特定線程捕捉到,并且線程可以安裝自己的信號處理器。

  6. 當前工作目錄:所有線程共享同一進程的工作目錄,任何線程改變工作目錄都會影響其他線程。

  7. 用戶ID和組ID:與安全性和權限相關的標識信息是所有線程共有的。

  8. 資源限制:例如最大文件大小、CPU時間等,這些限制適用于整個進程,因此也適用于所有線程。

因為多個線程共享資源,所以一個線程占用的資源比進程少。

但是線程也會有自己私有的資源

  1. 棧空間每個線程都有自己的棧,用于存儲函數調用時的局部變量、返回地址等信息。這是線程之間保持獨立性的關鍵之一,因為每個線程可以在其棧上進行獨立的操作而不干擾其他線程。

  2. 寄存器集合(上下文數據):當線程被調度執行時,它有自己的寄存器集,包括程序計數器(PC)、堆棧指針和其他通用寄存器。這些寄存器保存了線程執行的狀態信息。

  3. 線程ID:操作系統賦予每個線程一個唯一的標識符(TID),用于區分不同的線程。這個ID是線程私有的,因為它唯一地識別了一個線程。

  4. 線程優先級和調度屬性:某些系統允許為每個線程設定獨立的調度參數,如優先級和策略,這些屬性影響線程的執行順序和時間片分配。?

pthread 線程庫?

前言

Linux 的線程是用進程模擬的,線程在Linux底層被視為輕量級進程。對于同一個進程中的新、主線程,可以看出線程的 tid 和 LWP 的數值是不一樣的:

線程被創建、等待、分離、終止,且擁有獨立的棧結構,這些都是系統在管理線程,

1、系統管理線程時,并沒有對用戶暴露 在系統中線程被視為輕量級進程的事實,用戶認為那就是線程;

2、系統中沒有線程的概念,只有輕量級進程的概念,用戶卻能創建管理、操作線程。

能實現以上兩點是因為系統對底層的輕量級進程進行了封裝,用戶能操作線程都是因為有了庫,所以在Linux中線程也叫做用戶級線程。既然線程因庫而起,就應該由庫來維護。

認識線程庫

為了管理線程,“先描述再組織”,定義線程的控制塊 TCB,TCB是操作系統內核用來管理和調度線程的數據結構

#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

pthread_create 的第一個參數 thread 是一個 pthread_t 類型的輸出型參數,函數調用結束后,thread 指向一個虛擬內存單元,該內存單元的地址即為新創建線程的線程 ID,所以 pthread_t 類型的線程 ID 實際上就是一個進程地址空間的一個地址!線程庫的后續操作就是根據該線程 ID 來操作線程的,用戶也可以調用 pthread_self 函數來獲得線程自身的 ID。

線程庫中還包含了一系列用于創建、管理和操作線程的函數、類和數據結構。具體來說,一個典型的線程庫會提供以下組件:

1. 線程管理

  • 創建線程:函數或構造函數用來啟動一個新的線程,通常需要指定要在線程中執行的函數(即線程函數)。

    • 示例:pthread_create()?(POSIX Threads)
  • 銷毀/終止線程:方法來結束線程的執行,可以是自然結束(當線程函數返回時),也可以是通過特定API強制結束。

    • 示例:pthread_cancel(),?std::thread::join()?或?std::thread::detach()
  • 等待線程完成:允許主線程或其他線程等待某個特定線程完成其任務。

    • 示例:pthread_join(),?std::thread::join()

2. 線程同步機制

為了確保多個線程之間安全地共享資源,線程庫提供了各種同步工具:

  • 互斥鎖(Mutex):防止多個線程同時訪問臨界區代碼段。

    • 示例:pthread_mutex_t,?std::mutex
  • 讀寫鎖(Read-write Locks):允許多個讀者或單個寫者訪問資源。

    • 示例:pthread_rwlock_t
  • 條件變量(Condition Variables):用于線程間的通信,一個線程可以在滿足特定條件時喚醒另一個線程。

    • 示例:pthread_cond_t,?std::condition_variable
  • 信號量(Semaphores):控制對有限數量資源的訪問。

    • 示例:sem_t?(POSIX Semaphores)

3. 線程屬性設置

  • 設置線程屬性:在創建線程之前,可以設定一些線程屬性,如棧大小、調度策略等。
    • 示例:pthread_attr_t?(POSIX Threads)

4. 線程本地存儲(TLS)

  • 線程局部數據:為每個線程提供獨立的數據副本,即使這些變量是在全局范圍內聲明的。
    • 示例:pthread_key_create(),?pthread_getspecific(),?pthread_setspecific(),?std::thread_local?(C++)

5. 高級特性

  • 線程池:預先創建一組工作線程,以便快速響應任務請求而不必頻繁創建和銷毀線程。

    • 示例:?C++ 中可以通過第三方庫如Boost實現。
  • 并發容器:線程安全的數據結構,例如隊列、堆棧、哈希表等。

    • 示例:std::shared_timed_mutex,?concurrent_queue?(Intel TBB)
  • 原子操作:提供無鎖編程的支持,保證某些操作的原子性。

    • 示例:std::atomic?(C++)

6. 工具和輔助函數

  • 當前線程信息:獲取當前線程ID等信息。

    • 示例:pthread_self(),?std::this_thread::get_id()
  • 線程調度:調整線程優先級或讓出CPU給其他線程。

    • 示例:sched_yield(),?std::this_thread::yield()

簡單驗證線程的獨立棧空間

#include<iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;
#include<string>void* newthreadRun(void* args)
{std:string threadname=(char*)args;int cnt=5;while(true){std::cout<<"I am "<<threadname<<",cnt: "<<cnt<<", &cnt: "<<&cnt<<std::endl;cnt--;sleep(1);}return nullptr;
}int main()
{pthread_t tid1;pthread_t tid2;pthread_create(&tid1,nullptr,newthreadRun,(void*)"thread-1");   pthread_create(&tid2,nullptr,newthreadRun,(void*)"thread-2");pthread_join(tid2,nullptr);pthread_join(tid1,nullptr);return 0;
}

同一局部變量的地址不同, 說明每個線程的棧空間都私有一份該變量

?

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

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

相關文章

【magic-dash】01:magic-dash創建單頁面應用及二次開發

文章目錄 一、magic-dash是什么1.1 安裝1.2 使用1.2.1 查看內置項目模板1.2.2 生成指定項目模板1.2.3 查看當前magic-dash版本1.2.4 查看命令說明1.2.5 內置模板列表二、創建虛擬環境并安裝magic-dash三、magic-dash單頁工具應用開發3.1 創建單頁面項目3.1.1 使用命令行創建單頁…

從零開始使用MaxKB打造本地大語言模型智能問答系統與遠程交互

文章目錄 前言1. 下載運行Ollama2. 安裝大語言模型3. 安裝Cpolar工具4. 配置公網地址5. 固定公網地址6. MaxKB 添加Olama7.創建問答應用 前言 目前大語言模型&#xff08;LLM&#xff09;已經成為了人工智能領域的一顆璀璨明星&#xff0c;從自然語言處理到智能問答系統&#…

深度解析 Pytest 中的 conftest.py

關注開源優測不迷路 大數據測試過程、策略及挑戰 測試框架原理&#xff0c;構建成功的基石 在自動化測試工作之前&#xff0c;你應該知道的10條建議 在自動化測試中&#xff0c;重要的不是工具 在使用 Pytest 進行測試的過程中&#xff0c;conftest.py 文件扮演著極為重要的角色…

【python】銀行客戶流失預測預處理部分,獨熱編碼·標簽編碼·數據離散化處理·數據篩選·數據分割

數據預處理 通過網盤分享的文件&#xff1a;銀行流失預測數據和代碼 鏈接: https://pan.baidu.com/s/1loiB8rMvZArfjJccu4KW6w?pwdpfcs 提取碼: pfcs 非數值特征處理 目的&#xff1a;將非數值特征轉換為數值型&#xff0c;以便模型能夠處理。方法&#xff1a; 地理位置&am…

回歸預測 | MATLAB實現CNN-LSSVM卷積神經網絡結合最小二乘支持向量機多輸入單輸出回歸預測

回歸預測 | MATLAB實現CNN-LSSVM卷積神經網絡結合最小二乘支持向量機多輸入單輸出回歸預測 目錄 回歸預測 | MATLAB實現CNN-LSSVM卷積神經網絡結合最小二乘支持向量機多輸入單輸出回歸預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 回歸預測 | MATLAB實現CNN-LSSVM…

slam學習筆記7---狀態量求導相關數學公式

前言&#xff1a;本來打算只是歸納一下數學求導相關公式&#xff0c;后面也寫了旋轉求導相關內容&#xff0c;哈哈。感覺有點發散把握不住呀。水平有限&#xff0c;歡迎評論區點出。 一、基本初等函數求導公式 ( C ) ′ 0 , C (C)0,C (C)′0,C為常數 ( x μ ) ′ μ x μ ?…

32單片機串口數據接收、空閑IDLE中斷詳解

一、前提說明 一開始寫單片機程序的時候不太清楚空閑中斷這個東西&#xff0c;每次用串口接收數據&#xff0c;都要再開一個定時器&#xff0c;在定時器內進行倒計時&#xff0c;每次接收數據就重置計時時間&#xff0c;計時結束就觸發中斷&#xff0c;再判斷所有接收的數據&am…

深入探討 Go 中的高級表單驗證與翻譯:Gin 與 Validator 的實踐之道20241223

深入探討 Go 中的高級表單驗證與翻譯&#xff1a;Gin 與 Validator 的實踐之道 在現代后端開發中&#xff0c;表單驗證是保證數據完整性和服務穩定性的核心環節。如何優雅、高效地實現表單驗證&#xff0c;同時提供人性化的錯誤提示&#xff0c;是每位開發者的必修課。在本文中…

掌握 Ansys ACP 中的參考方向:簡化復雜的復合材料設計

概括 在復合材料分析領域&#xff0c;精度至關重要&#xff0c;尤其是在定義纖維方向和鋪層時。Ansys ACP&#xff08;Ansys Composite PrepPost&#xff09;提供了強大的工具來建立參考方向&#xff0c;這是實現精確結構模擬的關鍵步驟。在本博客中&#xff0c;我們將揭開在 …

Vue2學習(一)——Vue簡介、Vue指令與指令修飾符

一、Vue簡介 Vue是一套用于構建用戶界面的漸進式框架。 所謂漸進式就是循序漸進&#xff0c;不一定非得把Vue中的所有API都學完才能開發Vue&#xff0c;可以學一點開發一點。 Vue2官網地址&#xff1a;https://v2.cn.vuejs.org/ Vue3官網地址&#xff1a;https://cn.vuejs…

Redis--通用命令學習

目錄 一、引言 二、基礎命令 1.set 2.get 3.keys 3.1 keys &#xff1f; 3.2 keys * 3.3 keys [abe] 3.4 keys [^] 3.5 keys [a-b] 4.exists 5.delete 6.expire 7.ttl 8.type 三、Redis中的過期策略&#xff08;面試題&#xff09; 1.惰性刪除 2.定期刪除 …

Linux程序設計(第四版)| 學習筆記

上次學習Linux相關內容還是上學的時候為了應付考試&#xff0c;最近有項目涉及Linux&#xff0c;重新學習以下。 很多年前關于Linux的總結 一、入門 1.概念 (1) UNIX 1)定義&#xff1a;指的是一種遵循特定規范的計算機操作系統。 2)特點&#xff1a;簡單性、集中性、可重用…

PostgreSQL 的歷史

title: PostgreSQL 的歷史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能強大且廣泛使用的開源關系型數據庫管理系統。其歷史可以追溯到1986年,當時由加州大學伯克利分校的一個研究團隊開發。文章將深入探討 PostgreSQL 的起源、…

Ubuntu22.04 LTS 安裝nvidia顯卡驅動

準備跑老師給定的Github上的多模態源碼,但是用了這么久ubuntu還沒有嘗試過安裝nvidia驅動,好在也是一次成功,于是記錄下來。 借鑒的是Ubuntu22.04安裝顯卡驅動(高速、避錯版)-CSDN博客這篇文章,按照流程來基本沒有問題,不過個人覺得有些步驟比較冗余,所以記錄下來 主要…

WPS工具欄灰色怎么辦

WPS離線不登錄&#xff0c;開啟工具欄等相關功能 當你在使用WPS的過程中&#xff0c;若因網絡問題或其他特殊原因&#xff0c;導致無法登錄使用WPS時&#xff0c;可根據以下步驟開啟離線兼容模式&#xff0c;開啟此模式后&#xff0c;可在未登錄的狀態下&#xff0c;激活并使用…

國標GB28181-2022平臺EasyGBS:安防監控中P2P的穿透方法

在安防監控領域&#xff0c;P2P技術因其去中心化的特性而受到關注&#xff0c;尤其是在遠程視頻監控和數據傳輸方面。P2P技術允許設備之間直接通信&#xff0c;無需通過中央服務器&#xff0c;這在提高效率和降低成本方面具有明顯優勢。然而&#xff0c;P2P技術在實際應用中也面…

Mac Android studio 升級LadyBug 版本,所產生的bug

當Build 出現&#xff0c;這樣的文字以后&#xff1a; Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.3.3. Cannot sync the project. We recommend upgrading to Gradle version 8.9. The minimum compatible Gradle version is 8.5. …

com.google.common.collect.ImmutableList$SerializedForm

今天AndroidStudio安裝了個2021版本的&#xff0c;gradle用了7.3.3&#xff0c;創建項目后控制臺總是有這樣一個錯誤&#xff1a; Unable to load class com.google.common.collect.ImmutableList$SerializedForm. This is an unexpected error. Please file a bug containing…

Docker部署Sentinel

一、簡介 是什么&#xff1a;面向分布式、多語言異構化服務架構的流量治理組件 能干嘛&#xff1a;從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性 官網地址&#xff1a;https://sentinelguard.io/zh-c…

HTMLCSSJavaScriptDOM 之間的關系?

一、HTML 中文名&#xff1a;超文本標記語言 英文名&#xff1a;HyperText Markup Language HTML是一種用來結構化Web網頁及其內容的標記語言。 HTML 由一系列的元素組成&#xff0c;這些元素可以用來包圍不同部分的內容&#xff0c;使其以某種方式呈現或者工作。 圖Ⅰ 每…