線程與進程的深入解析及 Linux 線程編程

在操作系統中,進程和線程是進行并發執行的兩種基本單位。理解它們的區別和各自的特點,能夠幫助開發者更好地進行多任務編程,提高程序的并發性能。本文將探討進程和線程的基礎概念,及其在 Linux 系統中的實現方式,并介紹如何在 Linux 下進行線程編程。

進程與線程概念

進程

進程是程序的執行實例,是操作系統進行資源分配和調度的基本單位。每個進程都具有自己的獨立內存空間、程序計數器、堆棧等資源。進程的創建過程是通過復制當前進程的數據來完成的,常見的系統調用有?fork()?和?vfork()

  1. fork():創建一個子進程,子進程是父進程的副本,擁有獨立的內存空間。父進程和子進程的資源相互隔離。
  2. vfork():創建一個子進程時,父進程會被暫停,子進程共享父進程的內存空間,直到子進程調用?exec()?或?_exit()?來退出。

然而,進程的創建通常涉及大量的數據復制,影響系統的效率。這是因為每個進程都需要有獨立的資源,造成一定的開銷。

線程

線程是進程中的執行單位,也是操作系統調度的最小單位。與進程不同,線程不擁有獨立的資源,而是與同一進程中的其他線程共享進程的資源(如內存、文件描述符等)。線程的創建和銷毀比進程更加輕量級,因此線程通常用于提高并發性能。

一個線程通常由以下幾個部分組成:

  • 線程ID (Thread ID):每個線程都有一個唯一的標識符。
  • 程序計數器:指向線程執行的下一條指令。
  • 寄存器:保存線程執行的中間狀態。
  • :每個線程有自己的棧,用于保存局部變量和函數調用的上下文。

進程與線程的關系

  1. 線程依附于進程:每個線程都屬于某個進程,不能脫離進程獨立存在。
  2. 進程終止,線程隨之終止:當一個進程終止時,其內部所有的線程都會被終止。
  3. 一個進程可以創建多個線程:這使得進程內可以同時執行多個任務,從而提高并發度。

進程與線程的區別

  • 資源分配

    • 進程是資源分配的單位,每個進程都有獨立的資源。
    • 線程是調度執行的單位,多個線程共享同一進程的資源。
  • 創建開銷

    • 進程創建時需要復制大量數據,開銷較大。
    • 線程創建輕量級,開銷較小。
  • 調度單位

    • 進程是操作系統調度的基本單位。
    • 線程是操作系統調度的最小單位。

Linux 下的線程編程

在 Linux 系統中,線程編程通常依賴于?NPTL(Native POSIX Thread Library),這是一種本地線程庫,實現了 POSIX 標準中的線程相關接口。NPTL 庫提供了線程的創建、執行、結束等功能。

創建線程

Linux 中可以通過?pthread_create?函數創建線程。該函數的原型如下:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);
  • thread:線程的標識符。
  • attr:線程屬性,一般為?NULL?表示使用默認屬性。
  • start_routine:線程執行的函數(即線程的入口函數)。
  • arg:傳遞給?start_routine?函數的參數。

線程的執行函數通常定義如下:

void *do_something(void *arg) {printf("Thread %d\n", getpid());return NULL;
}

創建線程后,主線程和新創建的線程將并發執行。

線程的結束

線程可以通過以下幾種方式結束:

  1. 返回:線程執行函數返回時,線程結束,等價于調用?pthread_exit
  2. 調用?pthread_exit:主動調用?pthread_exit?結束線程。
  3. 線程被取消:通過?pthread_cancel?可以取消線程。
  4. 進程結束:如果進程結束,所有線程也會結束。
void pthread_exit(void *retval);
  • retval:線程退出時傳遞的返回值。

線程同步

線程共享進程的資源,這帶來了數據競爭問題。為了避免多個線程同時訪問共享數據導致的錯誤,我們通常使用互斥鎖(mutex)等同步機制。

例如,可以使用?pthread_mutex_lock?和?pthread_mutex_unlock?來保護臨界區:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;void *thread_func(void *arg) {pthread_mutex_lock(&mutex);// 臨界區代碼pthread_mutex_unlock(&mutex);return NULL;
}

線程終止與回收

當一個線程結束時,其資源不會立即釋放。如果需要主線程等待某個子線程結束并回收其資源,可以使用?pthread_join

int pthread_join(pthread_t thread, void **retval);
  • thread:要等待的線程。
  • retval:線程的返回值。

pthread_join?會阻塞當前線程,直到指定的線程結束。

示例代碼

以下是一個簡單的示例,展示如何在 Linux 下創建多個線程,分別打印不同的消息:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>void *thread1_func(void *arg) {printf("Thread 1: PID = %d\n", getpid());return NULL;
}void *thread2_func(void *arg) {printf("Thread 2: PID = %d\n", getpid());return NULL;
}int main() {pthread_t thread1, thread2;pthread_create(&thread1, NULL, thread1_func, NULL);pthread_create(&thread2, NULL, thread2_func, NULL);pthread_join(thread1, NULL);pthread_join(thread2, NULL);return 0;
}

查看全部

編譯時,使用?-lpthread?鏈接線程庫:

gcc -o thread_example thread_example.c -lpthread

結論

進程和線程是操作系統中的兩種基本單位,它們在資源管理和調度上各有不同。進程是資源分配的單位,而線程是調度的基本單位。在 Linux 中,NPTL 庫提供了高效的線程創建和管理方式,線程編程能夠顯著提高程序的并發性。在實際開發中,我們需要通過合適的同步機制來保證線程間的數據一致性。

希望這篇文章能幫助你更好地理解進程和線程,并掌握在 Linux 下的線程編程技巧。

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

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

相關文章

全面指南:使用JMeter進行性能壓測與性能優化(中間件壓測、數據庫壓測、分布式集群壓測、調優)

目錄 一、性能測試的指標 1、并發量 2、響應時間 3、錯誤率 4、吞吐量 5、資源使用率 二、壓測全流程 三、其他注意點 1、并發和吞吐量的關系 2、并發和線程的關系 四、調優及分布式集群壓測&#xff08;待仔細學習&#xff09; 1.線程數量超過單機承載能力時的解決…

springboot整合mybatis-plus【詳細版】

目錄 一&#xff0c;簡介 1. 什么是mybatis-plus2.mybatis-plus特點 二&#xff0c;搭建基本環境 1. 導入基本依賴&#xff1a;2. 編寫配置文件3. 創建實體類4. 編寫controller層5. 編寫service接口6. 編寫service層7. 編寫mapper層 三&#xff0c;基本知識介紹 1. 基本注解 T…

HTTP 常見狀態碼技術解析(應用層)

引言 HTTP 狀態碼是服務器對客戶端請求的標準化響應標識&#xff0c;屬于應用層協議的核心機制。其采用三位數字編碼&#xff0c;首位數字定義狀態類別&#xff0c;后兩位細化具體場景。 狀態碼不僅是服務端行為的聲明&#xff0c;更是客戶端處理響應的關鍵依據。本文將從協議規…

Unity中的鍵位KeyCode

目錄 主要用途 檢測按鍵事件&#xff1a; 處理鍵盤輸入&#xff1a; 基本鍵位 常用鍵&#xff1a; 字母鍵&#xff1a; 數字鍵&#xff1a; 功能鍵&#xff1a; 方向鍵&#xff1a; 控制鍵&#xff1a; 鼠標鍵&#xff1a; 其他特殊鍵&#xff1a; 代碼示例 按下…

高考或者單招考試需要考物理這科目

問題&#xff1a;幫忙搜索一下以上學校哪些高考或者單招考試需要考物理這科目的 回答&#xff1a; 根據目前獲取的資料&#xff0c;明確提及高考或單招考試需考物理的學校為湖南工業職業技術學院&#xff0c;在部分專業單招時要求選考物理&#xff1b;其他學校暫未發現明確提…

【設計模式】 代理模式(靜態代理、動態代理{JDK動態代理、JDK動態代理與CGLIB動態代理的區別})

代理模式 代理模式是一種結構型設計模式&#xff0c;它提供了一種替代訪問的方法&#xff0c;即通過代理對象來間接訪問目標對象。代理模式可以在不改變原始類代碼的情況下&#xff0c;增加額外的功能&#xff0c;如權限控制、日志記錄等。 靜態代理 靜態代理是指創建的或特…

Redis 限流

Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface AccessLimit {/*** 限制次數*/int count() default 15;/*** 時間窗口&#xff0c;單位為秒*/int seconds() default 60; }Aspect Component public class AccessLimitAspect {private static …

Android Coil3縮略圖、默認占位圖placeholder、error加載錯誤顯示,Kotlin(1)

Android Coil3縮略圖、默認占位圖placeholder、error加載錯誤顯示&#xff0c;Kotlin&#xff08;1&#xff09; implementation("io.coil-kt.coil3:coil-core:3.1.0")implementation("io.coil-kt.coil3:coil-network-okhttp:3.1.0") <uses-permission …

DeepSeek 助力 Vue 開發:打造絲滑的 鍵盤快捷鍵(Keyboard Shortcuts)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

uniapp引入uview組件庫(可以引用多個組件)

第一步安裝 npm install uview-ui2.0.31 第二步更新uview npm update uview-ui 第三步在main.js中引入uview組件庫 第四步在uni.scss中引入import "uview-ui/theme.scss"樣式 第五步在文件中使用組件

Jmeter進階篇(34)如何解決jmeter.save.saveservice.timestamp_format=ms報錯?

問題描述 今天使用Jmeter完成壓測執行,然后使用命令將jtl文件轉換成html報告時,遇到了報錯! 大致就是說jmeter里定義了一個jmeter.save.saveservice.timestamp_format=ms的時間格式,但是jtl文件中的時間格式不是標準的這個ms格式,導致無法正常解析。對于這個問題,有如下…

React 低代碼項目:網絡請求與問卷基礎實現

&#x1f35e;吐司問卷&#xff1a;網絡請求與問卷基礎實現 Date: February 10, 2025 Log 技術要點&#xff1a; HTTP協議XMLHttpRequest、fetch、axiosmock.js、postmanWebpack devServer 代理、craco.js 擴展 webpackRestful API 開發要點&#xff1a; 搭建 mock 服務 …

安裝海康威視相機SDK后,catkin_make其他項目時,出現“libusb_set_option”錯誤的解決方法

硬件&#xff1a;雷神MIX G139H047LD 工控機 系統&#xff1a;ubuntu20.04 之前運行某項目時&#xff0c;處于正常狀態。后來由于要使用海康威視工業相機&#xff08;型號&#xff1a;MV-CA013-21UC&#xff09;&#xff0c;便下載了并安裝了該相機的SDK&#xff0c;之后運行…

人工智能之自動駕駛技術體系

自動駕駛技術體系 自動駕駛技術是人工智能在交通領域的重要應用&#xff0c;旨在通過計算機視覺、傳感器融合、路徑規劃等技術實現車輛的自主駕駛。自動駕駛不僅能夠提高交通效率&#xff0c;還能減少交通事故和環境污染。本文將深入探討自動駕駛的技術體系&#xff0c;包括感…

淺談模組-相機鬼像

一&#xff0e;前言 在成像中&#xff0c;我們常常會遇到肉眼觀測的真實世界中&#xff0c;不存在的異常光影出現在畫面中&#xff0c;并伴有各種顏色&#xff0c;我們將這個物體稱為鬼像。某些鬼像可能會對圖像產生美感的體驗&#xff0c;但是大多數的鬼像都會對圖像的質量以…

vmware虛擬機Ubuntu Desktop系統怎么和我的電腦相互復制文件、內容

1、先安裝vmware workstation 17 player&#xff0c;然后再安裝Ubuntu Desktop虛擬機&#xff0c;然后再安裝vmware tools&#xff0c;具體可以參考如下視頻&#xff1a; VMware虛擬機與主機實現文件共享&#xff0c;其實一點也不難_嗶哩嗶哩_bilibili 2、本人親自試過了&…

Spring Boot項目中解決跨域問題(四種方式)

目錄 一&#xff0c;跨域產生的原因二&#xff0c;什么情況下算跨域三&#xff0c;實際演示四&#xff0c;解決跨域的方法 1&#xff0c;CrossOrigin注解2&#xff0c;添加全局過濾器3&#xff0c;實現WebMvcConfigurer4&#xff0c;Nginx解決跨域5&#xff0c;注意 開發項目…

Oracle JDK、Open JDK zulu下載地址

一、Oracle JDK https://www.oracle.com/java/technologies/downloads/ 剛進去是最新的版本&#xff0c;往下滑可以看到老版本 二、Open JDK的 Azul Zulu https://www.azul.com/downloads/ 直接可以選版本等選項卡

軟件測試:1、單元測試

1. 單元測試的基本概念 單元&#xff08;Unit&#xff09;&#xff1a;軟件系統的基本組成單位&#xff0c;可以是函數、模塊、方法或類。 單元測試&#xff08;Unit Testing&#xff09;&#xff1a;對軟件單元進行的測試&#xff0c;驗證代碼的正確性、規范性、安全性和性能…

Leetcode.264 丑數 II

題目鏈接 Leetcode.264 丑數 II mid 題目描述 給你一個整數 n n n &#xff0c;請你找出并返回第 n n n 個 丑數 。 丑數 就是質因子只包含 2 2 2、 3 3 3 和 5 5 5 的正整數。 示例1&#xff1a; 輸入&#xff1a;n 10 輸出&#xff1a;12 解釋&#xff1a;[1, 2, 3,…