Linux C/C++編程 —— 線程技術總結

一、線程基本概念

線程是進程內的一個執行單元,多個線程共享進程的資源(如內存、文件描述符等),但每個線程擁有自己的寄存器、棧等。與進程相比,線程的創建、切換開銷較小,能更高效地利用 CPU 資源。

二、線程創建與終止

  • 創建 :在 Linux 下,使用 pthread 庫的 pthread_create 函數創建線程。函數原型為 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); 參數 thread 存儲創建成功后的線程 ID,attr 為線程屬性(NULL 表示默認屬性),start_routine 是線程執行的函數,arg 為傳遞給執行函數的參數。

  • 終止 :線程可通過多種方式終止。一種是線程函數執行完畢正常退出;二是調用 pthread_exit 函數,參數用于返回線程的退出狀態;三是其他線程調用 pthread_cancel 函數來終止指定線程。

三、線程同步與互斥

  • 互斥鎖(Mutex) :防止多個線程同時訪問共享資源。使用 pthread_mutex_init 初始化互斥鎖,pthread_mutex_lock 鎖定互斥鎖,pthread_mutex_unlock 解鎖。需要注意避免死鎖問題,如不同線程按不同順序加鎖。

  • 條件變量 :讓線程等待某個條件滿足再繼續執行。與互斥鎖配合使用,pthread_cond_wait 會阻塞線程,直到另一個線程發出 pthread_cond_signal 或 pthread_cond_broadcast 信號。

  • 讀寫鎖(RWLock) :允許多個線程同時讀共享數據,但寫操作時只能有一個線程訪問。適用于讀操作多于寫操作的場景,通過 pthread_rwlock_t 類型及相關操作函數實現。

四、線程屬性設置

線程創建時可以設置屬性,如分離狀態(通過 pthread_attr_setdetachstate)。分離線程在終止時自動釋放資源,而非分離線程需其他線程通過 pthread_join 來回收資源。

五 、線程局部存儲(TLS)

為每個線程提供獨立的變量副本,避免共享變量的同步問題。使用 pthread_key_create 創建鍵,pthread_setspecific 設置線程局部變量,pthread_getspecific 獲取變量。

六、線程池

線程池預先創建一定數量的線程,避免頻繁創建和銷毀線程的開銷。任務放入任務隊列,線程從隊列中獲取任務執行。Linux 下可借助第三方庫或自己實現簡單的線程池。

七、性能優化與注意事項

  • 合理控制線程數量,避免過度線程化導致上下文切換頻繁。

  • 在同步機制中,盡量減少鎖的粒度,使用更高效的同步策略,如無鎖編程(適用于簡單場景,部分應用場景下性能更優)。

八、實際應用案例

  • 在服務器開發中,使用多線程處理多個客戶端連接,每個線程負責與一個客戶端通信。

  • 多媒體處理中,不同線程負責數據讀取、處理、輸出等不同階段,提高處理效率。

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

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

相關文章

Femap許可證與網絡安全策略

隨著科技的快速發展,網絡安全問題已成為各行各業關注的焦點。在電磁仿真領域,Femap作為一款領先的軟件,其許可證的安全性和網絡策略的重要性不言而喻。本文將探討Femap許可證與網絡安全策略的關系,確保您的電磁仿真工作能夠在一個…

深度解析:SQLynx 如何筑牢數據庫安全防線?

在數據驅動業務發展的時代,數據庫作為企業核心資產的 “保險箱”,其安全性至關重要。一旦數據庫遭遇攻擊、數據泄露或被誤操作,將給企業帶來不可估量的損失。而 SQLynx 作為一款專注于數據庫安全管理的工具,憑借其多項創新技術與功…

更新時間相差8個小時

下面的java代碼在updateFill方法里面生成的modifiedTime時間是當前時間是正確的,為什么到service層testCommonFieldAutoUpdate方法里面去更新的時候modifiedTime就差8個小時呢?代碼如下所示: Slf4j Component public class MpMetaObjectHand…

Windows逆向工程提升之IMAGE_TLS_DIRECTORY

公開視頻 -> 鏈接點擊跳轉公開課程博客首頁 -> ???鏈接點擊跳轉博客主頁 目錄 TLS的作用 TLS的實現 靜態 TLS?? 動態 TLS?? 內部實現 回調機制 TLS Directory 的結構 TLS的作用 TLS (Thread Local Storage) 是一種用于為多線程應用程序提供線程獨立存儲空…

云效流水線Flow使用記錄

概述 最近在頻繁使用阿里云云效的幾款產品,如流水線。之前寫過一篇,參考云效流水線緩存問題。 這篇文章來記錄更多問題。 環境變量 不管是云效流水線Flow還是應用交付AppStack(基于流水線,后文不再贅述)&#xff0…

Android中獲取控件尺寸進階方案

在Android開發中,很多場景都需要獲取控件(View)的寬高信息,比如動態布局調整、動畫效果實現等。然而,直接在Activity的onCreate()中調用控件的getWidth()或getHeight()`方法,得到結果卻是0,因為控件還沒完成布局測量。 本文總結了幾種獲取控件大小的實用方法,并對各方…

android 輸入系統

一、輸入系統的核心角色與分層架構 Android 輸入系統的本質是橋梁:一端連接硬件驅動產生的原始事件,另一端將事件精準派發給應用窗口。整個過程涉及三層架構和多個關鍵組件,可類比為 “快遞分揀系統”: 1. 硬件與內核層&#xf…

ubuntu中,c和c+程序,預編譯、編譯、鏈接和運行命令

目錄 安裝編譯器一.c編譯運行(粗暴簡單)1.編寫 C 程序:2. 預處理:3.編譯:4. 匯編:5. 鏈接:6.運行 二.c編譯運行(粗暴簡單)1.編寫 C 程序:2.預處理&#xff1a…

【FastAPI】--2.進階教程(一)

【FastAPI】--基礎教程-CSDN博客 app.get和post的參數: 參數類型說明pathstr路由路徑(如 "/marks"),必填。response_modelType[T]定義響應數據的模型(如 percent),會自動校驗和序列…

KT6368A通過藍牙芯片獲取手機時間詳細說明,對應串口指令舉例

一、功能簡介 KT6368A雙模藍牙芯片支持連接手機,獲取手機的日期、時間信息,可以同步RTC時鐘 1、無需安裝任何app,直接使用系統藍牙即可實現 2、同時它不影響音頻藍牙,還支持一些簡單的AT指令進行操作 3、實現的方式&#xff1…

【平面波導外腔激光器專題系列】用于光纖傳感的低噪聲PLC外腔窄線寬激光器

----翻譯自Mazin Alalusi等人的文章 摘要 高性價比的 1550 nm DWDM平面外腔 &#xff08;PLANEX&#xff09; 激光器是干涉測量、布里淵、LIDAR 和其他光傳感應用的最佳選擇。其線寬<3kHz、低相位/頻率噪聲和極低的RIN。 簡介 高性能光纖分布式傳感技術是在過去幾年中開發…

企業微信內部網頁開發流程筆記

背景 基于ai實現企微側邊欄和工作臺快速問答小助&#xff0c;需要h5開發&#xff0c;因為流程不清楚摸索半天&#xff0c;所以記錄一下 一、網頁授權登錄 1. 配置步驟 1.1 設置可信域名 登錄企業微信管理后臺 進入"應用管理" > 選擇開發的具體應用 > “網…

WORD 轉 PDF 工具:排版 / 圖片 / 表格批量轉換提升辦公效率

各位辦公小能手們&#xff0c;今天來聊聊文檔工具里的WORD轉PDF工具&#xff01;這玩意兒到底是干啥的呢&#xff1f;咱來好好說道說道。 先說核心功能。第一個就是格式轉換&#xff0c;能把Word文檔轉換成PDF&#xff0c;不管是格式、排版&#xff0c;還是圖片、表格啥的&…

從逆流監測到智慧用電:ADL200N-CT系列單相導軌表賦能家庭綠色能源

在新能源浪潮席卷全球的當下&#xff0c;陽臺光伏以及家庭儲能&#xff08;戶儲&#xff09;系統逐漸成為眾多追求綠色生活、渴望實現能源自主家庭的新選擇。它不僅能有效利用太陽能等清潔能源&#xff0c;還能在用電高峰時段為家庭提供穩定電力支持&#xff0c;降低用電成本。…

std::thread的說明與示例

源于通義千問 在 C 中&#xff0c;std::thread 支持傳遞多種類型的函數作為線程入口點。你可以傳遞普通函數、類的成員函數、Lambda 表達式、函數對象&#xff08;仿函數&#xff09;等。以下是詳細的說明和示例。 1. 傳遞普通函數 普通函數是最簡單的用法。 示例 #include…

【Day38】

DAY 38 Dataset和Dataloader類 對應5. 27作業 知識點回顧&#xff1a; Dataset類的__getitem__和__len__方法&#xff08;本質是python的特殊方法&#xff09;Dataloader類minist手寫數據集的了解 作業&#xff1a;了解下cifar數據集&#xff0c;嘗試獲取其中一張圖片 import …

RabbitMQ 集群與高可用方案設計(三)

五、高可用方案設計與實現 &#xff08;一&#xff09;負載均衡與代理 1. HAProxy 配置 HAProxy 是一款廣泛應用的開源負載均衡器和代理服務器&#xff0c;它能夠實現對 RabbitMQ 集群節點的負載均衡和健康檢查&#xff0c;有效提高系統的可用性和性能。以下是使用 HAProxy …

機器學習第二十四講:scikit-learn → 機器學習界的瑞士軍刀

機器學習第二十四講&#xff1a;scikit-learn → 機器學習界的瑞士軍刀 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&#xff1a;超詳細手把手指南 Scikit-…

百度ocr的簡單封裝

百度ocr地址 以下代碼為對百度ocr的簡單封裝,實際使用時推薦使用baidu-aip 百度通用ocr import base64 from enum import Enum, unique import requests import logging as logunique class OcrType(Enum):# 標準版STANDARD_BASIC "https://aip.baidubce.com/rest/2.0…

Ubuntu20.04 gr-gsm完整安裝教程

gr-gsm完整安裝教程 安裝gnuradio3.8安裝依賴項指定gnuradio源安裝gnuradio 安裝gr-gsm安裝依賴項安裝gr-gsm修改環境變量 安裝成功 安裝gnuradio3.8 安裝依賴項 sudo apt install git cmake g libboost-all-dev libgmp-dev swig python3-numpy python3-mako python3-sphinx …