C語言:多線程

多線程概述

定義

多線程是指在一個程序中可以同時運行多個不同的執行路徑(線程),這些線程可以并發或并行執行。并發是指多個線程在宏觀上同時執行,但在微觀上可能是交替執行的;并行則是指多個線程真正地同時執行,通常需要多核處理器的支持。

優點

  • 提高程序性能:充分利用多核處理器的資源,減少程序的執行時間。例如,在一個圖像處理程序中,可以使用多個線程分別處理不同區域的圖像,從而加快處理速度。

  • 增強響應性:在圖形用戶界面(GUI)程序中,使用多線程可以避免主線程被耗時的操作阻塞,保證界面的流暢性和響應性。例如,當用戶點擊一個按鈕觸發一個耗時的計算任務時,可以使用一個新的線程來執行該任務,而主線程繼續處理用戶的其他操作。

  • 提高資源利用率:在等待某些操作(如I/O操作)完成時,線程可以讓出CPU資源,讓其他線程繼續執行,從而提高CPU的利用率。

缺點

  • 線程安全問題:多個線程同時訪問共享資源時,可能會導致數據競爭、不一致等問題。例如,多個線程同時對一個共享變量進行讀寫操作,可能會導致數據的錯誤更新。

  • 上下文切換開銷:線程的切換需要保存和恢復線程的上下文信息,這會帶來一定的開銷,尤其是在頻繁切換線程的情況下。

  • 死鎖問題:多個線程在競爭資源時,可能會出現死鎖的情況,即每個線程都在等待其他線程釋放資源,從而導致所有線程都無法繼續執行。

多線程的實現

操作系統層面的支持

現代操作系統都提供了對多線程的支持,不同的操作系統有不同的線程實現方式。常見的線程庫有:

  • POSIX線程庫(pthread):是一種跨平臺的線程庫,廣泛應用于Unix、Linux和macOS等操作系統。它提供了一組函數來創建、管理和同步線程。

  • Windows線程庫:Windows操作系統提供了自己的線程庫,通過CreateThread等函數來創建和管理線程。

C語言中的多線程實現

(以pthread線程的創建和銷毀為例)

#include <stdio.h>
#include <pthread.h>// 線程函數
void* thread_function(void* arg) {printf("This is a new thread.\n");return NULL;
}int main() {pthread_t thread;// 創建線程if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {perror("pthread_create");return 1;}// 等待線程結束if (pthread_join(thread, NULL) != 0) {perror("pthread_join");return 1;}printf("Main thread: New thread has finished.\n");return 0;
}

代碼解釋

  • pthread_create:用于創建一個新的線程,第一個參數是指向線程標識符的指針,第二個參數是線程的屬性,通常設為NULL,第三個參數是線程函數的指針,第四個參數是傳遞給線程函數的參數。

  • pthread_join:用于等待指定的線程結束,并回收其資源。

線程的同步和互斥

為了避免多個線程同時訪問共享資源時出現數據競爭等問題,需要使用同步和互斥機制。常見的同步和互斥機制有互斥鎖(Mutex)、條件變量(Condition Variable)和信號量(Semaphore)等。

互斥鎖示例

#include <stdio.h>
#include <pthread.h>// 定義互斥鎖
pthread_mutex_t mutex;
// 共享資源
int shared_variable = 0;// 線程函數
void* thread_function(void* arg) {// 鎖定互斥鎖pthread_mutex_lock(&mutex);// 訪問共享資源shared_variable++;printf("Thread: shared_variable = %d\n", shared_variable);// 解鎖互斥鎖pthread_mutex_unlock(&mutex);return NULL;
}int main() {pthread_t thread1, thread2;// 初始化互斥鎖pthread_mutex_init(&mutex, NULL);// 創建線程pthread_create(&thread1, NULL, thread_function, NULL);pthread_create(&thread2, NULL, thread_function, NULL);// 等待線程結束pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 銷毀互斥鎖pthread_mutex_destroy(&mutex);return 0;
}

代碼解釋

  • pthread_mutex_init:初始化互斥鎖。

  • pthread_mutex_lock:鎖定互斥鎖,如果互斥鎖已經被其他線程鎖定,則當前線程會阻塞。

  • pthread_mutex_unlock:解鎖互斥鎖,允許其他線程鎖定該互斥鎖。

  • pthread_mutex_destroy:銷毀互斥鎖,釋放相關資源。

多線程編程的注意事項

線程安全

在多線程編程中,要確保對共享資源的訪問是線程安全的。可以通過使用同步和互斥機制來實現線程安全,避免數據競爭和不一致的問題。

死鎖避免

死鎖是多線程編程中常見的問題,為了避免死鎖,可以采用以下方法:

  • 按順序加鎖:確保所有線程按照相同的順序獲取鎖,避免循環等待。

  • 限時加鎖:在獲取鎖時設置一個超時時間,如果在規定時間內無法獲取鎖,則放棄鎖的獲取,避免線程一直阻塞。

資源管理

在多線程編程中,要注意資源的管理,避免資源泄漏。例如,在使用完互斥鎖、條件變量等資源后,要及時銷毀。

多線程的應用場景

服務器端編程

在服務器端編程中,多線程可以用于處理多個客戶端的請求。每個客戶端的請求可以由一個獨立的線程來處理,從而提高服務器的并發處理能力。

并行計算

在科學計算、圖像處理等領域,多線程可以用于并行計算,將一個大的任務分解成多個小的子任務,由多個線程同時執行,從而加快計算速度。

圖形用戶界面(GUI)編程

在GUI編程中,多線程可以用于處理耗時的操作,避免主線程被阻塞,保證界面的流暢性和響應性。例如,在一個文件下載的GUI程序中,可以使用一個新的線程來執行文件下載任務,而主線程繼續處理用戶的其他操作。

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

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

相關文章

Linux線程池實現

1.線程池實現 全部代碼&#xff1a;whb-helloworld/113 1.喚醒線程 一個是喚醒全部線程&#xff0c;一個是喚醒一個線程。 void WakeUpAllThread(){LockGuard lockguard(_mutex);if (_sleepernum)_cond.Broadcast();LOG(LogLevel::INFO) << "喚醒所有的休眠線程&q…

微信小程序逆向開發

一.wxapkg文件 如何查看微信小程序包文件&#xff1a; 回退一級 點擊進入這個目錄 這個就是我們小程序對應的文件 .wxapkg概述 .wxapkg是微信小程序的包文件格式&#xff0c;且其具有獨特的結構和加密方式。它不僅包含了小程序的源代碼&#xff0c;還包括了圖像和其他資源文…

多輸入多輸出 | Matlab實現CPO-LSTM冠豪豬算法優化長短期記憶神經網絡多輸入多輸出預測

多輸入多輸出 | Matlab實現CPO-LSTM冠豪豬算法優化長短期記憶神經網絡多輸入多輸出預測 目錄 多輸入多輸出 | Matlab實現CPO-LSTM冠豪豬算法優化長短期記憶神經網絡多輸入多輸出預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 Matlab實現CPO-LSTM冠豪豬算法優化長短期…

視頻編碼器的抉擇:x264、x265、libaom、vvenc 對比測試實驗

264、x265、libaom、vvenc 對比測試實驗 測試機器配置&#xff1a;Apple M1 Pro -16G編碼器版本&#xff08;選擇自己編譯&#xff09;&#xff1a;所有源碼都是當前最新更新的狀態&#xff0c;此外各類編碼具體的編譯過程可參考我的相關系列博客。 編碼器GitHubx264git clon…

【二刷代碼隨想錄】雙指針-數組相關題型、推薦習題

一、雙指針-數組 相關題型與常用思路 1、單個數組 &#xff08;1&#xff09;原地移除元素類 如推薦習題中的&#xff08;1&#xff09;、&#xff08;2&#xff09;、&#xff08;3&#xff09;&#xff0c;都屬于此類。引入雙指針 pre、last &#xff0c;用 pre 指針表明數…

Level DB --- TableCache

TableCache 是Level DB 中重要的類&#xff0c;Level DB 中多層&#xff08;multi level&#xff09;&#xff0c;且每一層&#xff08;level&#xff09;有多個 key-value file&#xff0c;TableCache正是用來緩存多層以及多層中的file數據&#xff0c;更快速地檢索。 table …

搜索-BFS

馬上藍橋杯了&#xff0c;最近刷了廣搜&#xff0c;感覺挺有意思的&#xff0c;廣搜題類型都差不多&#xff0c;模板也一樣&#xff0c;大家寫的時候可以直接套模板 這里給大家講一個比較經典的廣搜題-迷宮 題目問問能否走到 (n,m) 位置&#xff0c;假設最后一個點是我們的&…

智能預測維護:讓設備“未卜先知”,減少宕機煩惱

智能預測維護:讓設備“未卜先知”,減少宕機煩惱 1. 引言:設備維護的痛點與出路 在工業生產和自動化領域,設備故障一直是令人頭疼的問題。設備一旦故障,輕則影響生產效率,重則造成嚴重損失,甚至帶來安全隱患。傳統的設備維護方式主要有兩種: 被動維護(Reactive Maint…

安卓的布局方式

一、RelativeLayout 相對布局 特點&#xff1a;每個組件相對其他的某一個組件進行定位。 (一)主要屬性 1、設置和父組件的對齊&#xff1a; alignParentTop &#xff1a; 設置為true&#xff0c;代表和父布局頂部對齊。 其他對齊只需要改變后面的Top為 Left、Right 或者Bottom&…

SSM中藥分類管理系統

&#x1f345;點贊收藏關注 → 添加文檔最下方聯系方式咨詢本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345; 項目視頻 SS…

epoch、batch、batch size、step、iteration深度學習名詞含義詳細介紹

卷積神經網絡訓練中的三個核心概念&#xff1a;Epoch、Batch Size 和迭代次數 在深度學習中&#xff0c;理解一些基本的術語非常重要&#xff0c;這些術語對模型的訓練過程、效率以及最終性能都有很大影響。以下是一些常見術語的含義介紹&#xff1a; 1. Epoch&#xff08;周…

React(七):Redux

Redux基本使用 純函數&#xff1a;1.函數內部不能依賴函數外部變量&#xff1b;2.不能產生副作用&#xff0c;在函數內部改變函數外部的變量 React只幫我們解決了DOM的渲染過程&#xff0c;State還是要由我們自己來管理——redux可幫助我們進行管理 Redux三大特點 1.單一數…

《Android低內存設備性能優化實戰:深度解析Dalvik虛擬機參數調優》

1. 痛點分析&#xff1a;低內存設備的性能困局 現象描述&#xff1a;大應用運行時頻繁GC導致卡頓 根本原因&#xff1a;Dalvik默認內存參數與硬件資源不匹配 解決方向&#xff1a;動態調整堆內存參數以平衡性能與資源消耗 2. 核心調優參數全景解析 關鍵參數矩陣&#xff1…

STC89C52單片機學習——第38節: [17-2] 紅外遙控紅外遙控電機

寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難&#xff0c;但我還是想去做&#xff01; 本文寫于&#xff1a;2025.03.30 51單片機學習——第38節: [17-2] 紅外遙控&紅外遙控電機 前言開發板說明引用…

計算機組成原理————計算機運算方法精講<1>原碼表示法

第一部分:無符號數和有符號數的概念 1.無符號數 計算機中的數均存放在寄存器當中,通常稱寄存器的位數為機器字長,所謂無符號數,就是指沒有fu5號的數,在寄存器中的每一位均可用來存放數值,當存放有符號數時,需要留出位置存放符號,機器字長相同時,無符號數與有符號數所…

【什么是機器學習——多項式逼近】

什么是機器學習——多項式逼近 機器學習可以分成三大類別,監督學習、非監督學習、強化學習。三大類別背后的數學原理不同。監督學習使用了數學分析中的函數逼近方法和概率統計中的極大似然方法;非監督學習使用聚類和EM算法;強化學習使用馬爾可夫決策過程的想法。 機器學習的…

Ubuntu 22.04 上安裝阿里云 CLI(命令行工具)

在 Ubuntu 22.04 上安裝阿里云 CLI&#xff08;命令行工具&#xff09;可以通過以下步驟完成&#xff1a; 步驟 1&#xff1a;下載阿里云 CLI 安裝包 打開終端&#xff0c;首先更新你的軟件包索引&#xff1a; sudo apt update安裝 curl&#xff08;如果還沒有安裝&#xff09…

?Android Gradle 插件(AGP)版本與 ?Gradle 版本需要嚴格對應

一、AGP 與 Gradle 版本對照表 Android Gradle 插件版本對應 Gradle 版本適用 Android Studio 版本?8.1.x8.2Arctic Fox (2020.3.1+)?8.0.x8.0Arctic Fox (2020.3.1+)?7.4.x7.5.1IntelliJ IDEA 2022+?7.3.x7.4IntelliJ IDEA 2022+?7.2.x7.3.3IntelliJ IDEA 2021.3+?7.1.x…

【Matlab】-- 基于MATLAB的灰狼算法優化支持向量機的回歸算法

文章目錄 文章目錄 01 內容概要02 GWO-SVR模型03 部分代碼04 運行結果05 參考文獻06 代碼下載 01 內容概要 GWOSVR&#xff08;基于灰狼算法優化的支持向量機回歸&#xff09;是一種先進的機器學習技術&#xff0c;它結合了灰狼優化算法&#xff08;Grey Wolf Optimizer, GWO…

Google Play Games PC版即將正式上線!

早在 2021 年&#xff0c;谷歌就推出 Google Play Games PC 版&#xff0c;本質上是基于虛擬化創建安卓系統在 Windows 上運行 Google Play 平臺的各種游戲。 在測試了 4 年后&#xff0c;谷歌準備在今年晚些時候正式上線該平臺&#xff0c;谷歌將在下周舉辦 2025 游戲開發者大…