Linux 線程初步解析

1.線程概念

在一個程序里的一個執行路線就叫做線程(thread)。更準確的定義是:線程是“一個進程內部的控制序列。在linux中,由于線程和進程都具有id,都需要調度等等相似性,因此都可以用PCB來描述和控制,線程含有PCB,沒有獨立的地址空間,和進程內的其他線程共享地址空間。如下圖:

從資源的角度上看,進程是資源分配的基本單位,線程是cpu調度的基本單位。每一個控制線程pcb,我們都可以看成是執行流,執行流可以是線程,也可以是只有一個線程的進程,在Linux中,所有執行流我們都可以看成輕量級進程(LWP)。

2.線程控制函數

首先,我們要了解Linux沒有真正意義上的線程,所有執行流都是LWP,因此,為了滿足用戶對線程使用的需求,Linux的線程庫對LWP的接口進行了封裝,我們把庫里封裝好的線程稱為用戶級線程。

1.pthread_create創建線程

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

第一個參數是輸出型參數,輸出新線程的用戶級線程id,參數2:設置線程的屬性,參數3:返回值和參數都為void* 類型的函數指針,參數4:函數參數。創建線程,執行傳入的函數。

2.pthread_join等待線程

#include <pthread.h>int pthread_join(pthread_t thread, void **retval);

第一個參數是要等的線程id,第二個是線程執行后返回值?。

3.?pthread_exit,pthread_cancel,pthread_self()?

int pthread_exit()線程退出,exit()是進程退出。

int pthread_cancel(pthread_t thread)讓某個進程退出

pthread pthread_self() 用于獲取用戶態線程的tid

4.代碼

#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <unistd.h>
#include <cstdlib>
#include<time.h>
#include <pthread.h> // 原生線程庫的頭文件
using namespace std;// pthread_create(pthread_t &tid, nullptr, handlerTask, td);創建線程的接口
//pthread_join(tid, &ret);線程等待
// pthread_exit()線程退出
//pthread_cancel(tid)取消線程
pthread_self() 用于獲取用戶態線程的tidvoid * handlerTask(void* args)
{string s1=(const char*)args;sleep(10);cout<<"我是"<<s1<<" pid 是 "<<getpid()<<endl;cout<<"我的用戶級線程id是"<<pthread_self()<<endl;string* s2=new string("haha");pthread_exit(s2);}int main()
{cout<<"我是主線程"<<" pid 是 "<<getpid()<<endl;cout<<"我的用戶級線程id是"<<pthread_self()<<endl;const char* s1="新線程";pthread_t tid;pthread_create(&tid, nullptr, handlerTask, (void*)s1);cout<<"新進程用戶級id是"<<tid<<endl;void *ret=nullptr;pthread_join(tid, &ret);cout<<"結果為"<<*((string*)ret)<<endl;
}

makefile 文件(注意一定要鏈接pthread庫)

test1:test1.ccg++ -o $@ $^ -std=c++11 -lpthread
.PHONY:clean
clean:rm -f test1

運行結果:

5.進程分離

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

可以是線程組內其他線程對目標線程進行分離,也可以是線程自己分離.

pthread_detach(pthread_self());

3.用戶級進程的實現

在共享區上由pthead動態庫來維護,封裝了LWP,其中用戶級進程的id就是虛擬地址。?

4.資源問題

1.線程私有的:

  • 線程的硬件上下文(cpu寄存器的值)
  • 線程的獨立棧結構
  • 線程id
  • 信號屏蔽字
  • ?errno 信號屏蔽字
  • 調度優先級

2.線程共享的

  • 內存和地址空間(代碼和全局數據)
  • 文件描述符表
  • 每種信號的處理方式(SIG_ IGN、SIG_ DFL或者自定義的信號處理函數)
  • 當前工作目錄
  • 用戶id和組id

5.進程線程的優缺點

線程的優點

  • 創建一個新線程的代價要比創建一個新進程小得多(線程的地址內存和地址空間是共享的,只需要創間pcb)
  • 與進程之間的切換相比,線程之間的切換需要操作系統做的工作要少很多(線程切換時由于數據共享,cache不需要重新加載,而進程切換需要重新加載)。
  • 線程占用的資源要比進程少很多
  • 能充分利用多處理器的可并行數量
  • 在等待慢速I/O操作結束的同時,程序可執行其他的計算任務
  • 計算密集型應用,為了能在多處理器系統上運行,將計算分解到多個線程中實現
  • I/O密集型應用,為了提高性能,將I/O操作重疊。線程可以同時等待不同的I/O操作。

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

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

相關文章

美聯儲降息應該更早?高盛:有充分理由7月降息,而非9月

KlipC報道&#xff1a;高盛首席經濟學家哈祖斯Jan Hatzius表示&#xff0c;美聯儲“有充分理由”在7月會議上降息&#xff0c;而非等到9月。 在最新發布的報告中&#xff0c;他表明通脹已經取得了足夠的進展&#xff0c;回到了美聯儲2%的長期目標附近&#xff0c;這將使美聯儲…

[C++ 入門基礎 - 命名空間]

在C中&#xff0c;命名空間&#xff08;Namespace&#xff09;是一種用來組織代碼并避免命名沖突的機制。命名空間可以包含變量、函數、類等C中的所有實體&#xff0c;使得這些實體的名稱在命名空間內部有效&#xff0c;避免了與其他命名空間或全局作用域中相同名稱的沖突。 文…

實現將Nginx的每個網站配置單獨的訪問日志

一、問題描述 Nginx默認的訪問日志是不會區分哪個網站有哪些日志的,全部糅雜在一起;如果需要哪個網站有哪些訪問日志記錄,還需要將訪問日志下載下來后篩選,比較麻煩;希望將每個網站對應的日志能夠單獨記錄到對應的日志文件里面,方便排查和管理。 # 進入Nginx默認的日志文…

為什么Vim是程序員最喜歡的編輯器之一

簡介 Vim&#xff0c;全稱Vi IMproved&#xff0c;是一種高度可定制、功能強大的文本編輯器。自其誕生以來&#xff0c;它以高效、快速和靈活的特點深受程序員喜愛。無論是處理簡單的文本文件還是復雜的代碼項目&#xff0c;Vim都能提供卓越的編輯體驗。許多資深程序員甚至稱其…

c++ primer plus 第16章string 類和標準模板庫,6.1.5字符串種類

c primer plus 第16章string 類和標準模板庫,6.1.5字符串種類 c primer plus 第16章string 類和標準模板庫,6.1.5字符串種類 文章目錄 c primer plus 第16章string 類和標準模板庫,6.1.5字符串種類6.1.5字符串種類 6.1.5字符串種類 本節將 string 類看作是基于 char 類型的。…

web服務器經過代理后的絕對路徑問題,以及 dirname(__FILE__)和__DIR__

web服務器經過代理后的絕對路徑問題&#xff0c;以及 dirname&#xff08;__FILE__&#xff09;和__DIR__ 問題描述情況解析資源路徑分析訪問過程分析 dirname(\_\_FILE\_\_) 與 \_\_DIR\_\_ 同步發布在個人筆記web服務器經過代理后的絕對路徑問題&#xff0c;以及 dirname(__F…

Nest.js 實戰 (一):使用過濾器優雅地統一處理響應體

前言 在我們實際的業務開發中&#xff0c;我們可以看到后端接口返回格式都有一定的要求&#xff0c;假如我們統一規定接口的統一返回格式為&#xff1a; {data: any; // 業務數據code: number; // 狀態碼msg: string; // 響應信息timestamp: number; // 時間戳 }那么在 Nest.…

【智能算法改進】改進的麻雀搜索算法及其求解旅行商問題

目錄 1.算法原理2.改進點3.結果展示4.參考文獻5.代碼獲取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及實現 2.改進點 改進發現者更新位置 為了使 SSA 算法能夠避開向原點收斂的弊端, 將算法向最優位置跳躍的操作轉換為向最優位置的移動: X i ,…

自己動手寫一個滑動驗證碼組件(后端為Spring Boot項目)

近期參加的項目&#xff0c;主管丟給我一個任務&#xff0c;說要支持滑動驗證碼。我身為50歲的軟件攻城師&#xff0c;當時正背著雙手&#xff0c;好像一個受訓的保安似的&#xff0c;中規中矩地參加每日站會&#xff0c;心想滑動驗證碼在今時今日已經是標配了&#xff0c;司空…

一個篇文章告訴你一個APP前端搭建有多簡單

用uni-app 1.新建uni-app項目 點擊項目 2.創建 最后點擊右下方創建 3.添加tarbar 首先你要創建幾個頁面這里比如說我有兩個頁面的tarbar首頁(home)和我的(userIndex) 在pages目錄下右鍵新建頁面即可

從庫存超賣問題分析鎖和分布式鎖的應用(二)

本文從一個經典的庫存超賣問題分析說明常見鎖的應用&#xff0c;假設庫存資源存儲在Redis里面。 假設我們的減庫存代碼如下&#xff1a; Autowired StringRedisTemplate redisTemplate;public void deduct(){String stock redisTemplate.opsForValue().get("stock"…

JavaSE從零開始到精通

1.前置知識 JVM&#xff1a;java virtrual machine, java虛擬機, 專門用于執行java代碼的一款軟件。JRE&#xff1a;java runtime enviroment, java運行時環境, java官方提供的核心類庫. jre中包含了核心類庫和jvm。JDK: java development kit, java開發工具包, javac.exe, ja…

LVS+Keepalive高可用

1、keepalive 調度器的高可用 vip地址主備之間的切換&#xff0c;主在工作時&#xff0c;vip地址只在主上&#xff0c;vip漂移到備服務器。 在主備的優先級不變的情況下&#xff0c;主恢復工作&#xff0c;vip會飄回到住服務器 1、配優先級 2、配置vip和真實服務器 3、主…

我想做信號通路分析,但我就是不想學編程

“我想做信號通路分析&#xff0c;但我就是不想學編程。” “我又不是生信狗&#xff0c;學代碼會死。” “你們這些做生信的&#xff0c;整天把數據分析搞得神神秘秘&#xff0c;不就是怕被人搶飯碗而已嘛。” “這都沒分析出我想要的結果&#xff0c;不靠譜。” “你們做…

【自學安全防御】二、防火墻NAT智能選路綜合實驗

任務要求&#xff1a; &#xff08;銜接上一個實驗所以從第七點開始&#xff0c;但與上一個實驗關系不大&#xff09; 7&#xff0c;辦公區設備可以通過電信鏈路和移動鏈路上網(多對多的NAT&#xff0c;并且需要保留一個公網IP不能用來轉換) 8&#xff0c;分公司設備可以通過總…

使用Docker創建并運行一個create-react-app應用(超簡單)

創建并運行一個使用 Create React App (CRA) 創建的應用程序的 Docker 容器涉及幾個步驟。以下是一個詳細的過程&#xff0c;包括創建一個簡單的 React 應用、編寫 Dockerfile、構建鏡像以及運行容器。 步驟 1: 創建一個新的 React 應用 如果你還沒有一個 React 應用&#xf…

Java爬蟲安全策略:防止TikTok音頻抓取過程中的請求被攔截

摘要 在當今互聯網時代&#xff0c;數據采集已成為獲取信息的重要手段。然而&#xff0c;隨著反爬蟲技術的不斷進步&#xff0c;爬蟲開發者面臨著越來越多的挑戰。本文將探討Java爬蟲在抓取TikTok音頻時的安全策略&#xff0c;包括如何防止請求被攔截&#xff0c;以及如何提高…

RK3568 安卓12 EC20模塊NOCONN沒有ip的問題(已解決)

從網上東拼西湊找了不少教程&#xff0c;但是里面沒有提到rillib.so需要替換&#xff0c;替換掉就可以上網了&#xff0c;系統也有4G圖標了。 注意&#xff0c;這個rillib.so是移遠提供的。把他們提供的文件放到rk3568_android_sdk/vendor/rockchip/common/phone/lib下&#x…

Andriod Stdio新建Kotlin的Jetpack Compose簡單項目

1.選擇 No Activity 2.選擇kotlin 4.右鍵選擇 在目錄MyApplication下 New->Compose->Empty Project 出現下面的畫面 Finish 完成

C++——類和對象(中)

文章目錄 一、類的默認成員函數二、構造函數三、析構函數四、拷?構造函數五、賦值運算符重載1. 運算符重載2. 賦值運算符重載 六、取地址運算符重載const成員函數取地址運算符重載 七、應用&#xff1a;?期類實現Date.hDate.cpptest.cpp 一、類的默認成員函數 默認成員函數就…