C++學習之線程

目錄

1.進程和線程的概念

2.線程內核三級映射

3.線程優缺點

4.創建線程和獲取線程ID的函數

5.創建子線程

6.循環創建N個子線程

7.子線程傳參地址錯誤演示分析

8.主、子線程共享全局變量、堆空間

9.線程退出

10.pthread join回收線程退出值

11.pthread_cancel

12.殺死線程pthread_cancel

13.進程線程對比

14.線程屬性簡介


1.進程和線程的概念

-?Linux 系統中,線程 LWP 稱之為:輕量級的進程。
-?進程:有獨立的進程地址空間, 有獨立的 pcb。 —— 最小資源分配單位。
-?線程:有獨立的pcb,沒有獨立的進程地址空間。(與其他線程共享) —— 最小執行單位。

![1584326812185](課堂筆記10.assets/1584326812185.png)

-?一個創建了線程的進程,本身也淪落 為線程。

![1584327010849](課堂筆記10.assets/1584327010849.png)

-?LWP 號: cpu 劃分時間片依據。??—— 線程 最小執行單位。
????-?查看LWP號命令: ps -Lf 進程pid?

2.線程內核三級映射

3.線程優缺點

-?優點:
????-?并發性強。??
????-?開銷小。
????-?數據通信方便。
-?缺點:
????-?庫函數,穩定性差。
????-?調試、編寫困難
????-?對信號支持差。
-?結論:既能使用進程開發,也能使用線程開發的程序,首選 線程。

4.創建線程和獲取線程ID的函數

```c
#include <pthread.h>
pthread_t pthread_self(void);???// 獲取線程id, 在進程內部標識線程身份。

返回線程id。 沒有錯誤!
```

5.創建子線程

```c
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
??????????????????????????void *(*start_routine) (void *), void *arg);
參1: 傳出參數,新子線的 線程id
參2: 線程屬性。默認傳 NULL, 表使用默認屬性。
參3: 子線程回調函數。pthread_create 調用成功,該函數會被自動調用起來。
參4: 參3 的參數。
返回值:
????成功:0
????失敗:直接返回錯誤號!

6.循環創建N個子線程

```c
// 子線程主函數
void *tfn(void *arg)
{
????printf("tfn : pid = %d, pthread_id = %lu\n", getpid(), pthread_self());
????return NULL;
}
int main(int argc, char *argv[])
{
????pthread_t tid;

????// 創建子線程
????int ret = pthread_create(&tid, NULL, tfn, NULL);
????if (ret != 0)
????????fprintf(stderr, "pthread_create err:%s\n", strerror(ret));

????printf("main : pid = %d, pthread_id = %lu\n", getpid(), pthread_self());
????sleep(1);????????// 給子線程執行時間

????return 0;????????// 釋放

7.子線程傳參地址錯誤演示分析

8.主、子線程共享全局變量、堆空間

// 阻塞 回收線程。
int pthread_join(pthread_t thread, void **retval);
參1:待回收的線程id
參2:傳出參數。回收的那個線程的 退出值。
????進程中:main返回值:return 0、 exit(1)??---> int。 回收進程退出值 wait(int *)
????線程中:線程返回值:pthread_exit --> void *。 回收線程退出值 pthread_join(void **)
返回值:
????成功:0
????失敗:直接返回錯誤號!
```

9.線程退出

```c
// 子線程主題函數
void *tfn(void *arg)
{
????sleep(5);
????//return (void *)74;
????pthread_exit((void *)"hello");
}

int main(int argc, char *argv[])
{
????pthread_t tid;
????//int *retval;????// 用來存儲子進程退出值
????char *retval;????// 用來存儲子進程退出值

????// 創建子線程
????int ret = pthread_create(&tid, NULL, tfn, NULL);
????if (ret != 0)
????????fprintf(stderr, "pthread_create err:%s\n", strerror(ret));

????printf("----------------1\n");
????// 回收子線程退出值
????ret = pthread_join(tid, (void **)&retval);
????if (ret != 0)
????????fprintf(stderr, "pthread_join err:%s\n", strerror(ret));

????printf("child thread exit with %s\n", (char *)retval);

????pthread_exit((void *)0);????????// 退出主線程
}

10.pthread join回收線程退出值

```c
struct thrd {
????int var;
????char str[256];
};

// 子線程主題函數
void *tfn(void *arg)
{
????struct thrd *tval = (struct thrd *)arg;????????????//malloc()
????tval->var = 100;
????strcpy(tval->str, "hello thread");

????pthread_exit((void *)tval);
????// return (void *)tval;????????????????// 也可以
}

int main(int argc, char *argv[])
{
????pthread_t tid;
????struct thrd arg, *retval;

????// 創建子線程
????int ret = pthread_create(&tid, NULL, tfn, (void *)&arg);
????if (ret != 0)
????????fprintf(stderr, "pthread_create err:%s\n", strerror(ret));

????// 回收子線程退出值
????ret = pthread_join(tid, (void **)&retval);
????if (ret != 0)
????????fprintf(stderr, "pthread_join err:%s\n", strerror(ret));
????
????printf("child exit with: var = %d, str= %s\n", retval->var, retval->str);

????// free();
????
????pthread_exit((void *)0);????????// 退出主線程
}

```

11.pthread_cancel

-?與進程類似,線程結束時,也有 “僵尸線程” 產生。消耗系統資源。

```c
int pthread_detach(pthread_t thread);??// 設置線程為分離態。
參:待設置為分離的線程id
```

-?設置為 分離態的 線程,在終止時,會自動清理 pcb 內核殘留。
-?對于已經分離的線程,使用 pthread_join() 不能正常回收。不能獲取線程退出值。

12.殺死線程pthread_cancel

``c
int pthread_cancel(pthread_t thread);
參:待殺死的線程id
```

1.?被 pthread_cancel() 殺死的線程,在使用 pthread_join() 回收,得到的退出值 -1。?
2.?pthread_cancel() 殺死線程必須要到達一個 “取消點” (保存點), 才能生效。否則無法殺死線程。
????-?應該在被cancel的線程中,調用 pthread_testcancel() 函數 來 添加 “取消點” (保存點)。

13.進程線程對比

1.?return
2.?pthread_exit()
3.?pthread_cancel()???需要 “保存點”。 —— 進內核,即可得到。

14.線程屬性簡介

| 線程控制原語?????| 進程控制原語???|
| ---------------- | -------------- |
| pthread_create() | fork()?????????|
| pthread_self()???| getpid()???????|
| pthread_exit()???| exit()?????????|
| pthread_join()???| wait/waitpid() |
| pthread_cancel() | kill()?????????|
| pthread_detach() |????????????????|
?

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

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

相關文章

element-plus中,表單校驗的使用

目錄 一.案例1&#xff1a;給下面的表單添加校驗 1.目的要求 2.步驟 ①給需要校驗的el-form-item項&#xff0c;添加prop屬性 ②定義一個表單校驗對象&#xff0c;里面存放了每一個prop的檢驗規則 ③給el-form組件&#xff0c;添加:rules屬性 ④給el-form組件&#xff0…

團體設計程序天梯賽L2-025 # 分而治之

文章目錄 題目解讀輸入格式輸出格式 思路Ac Code參考 題目解讀 在戰爭中&#xff0c;我們希望首先攻下敵方的部分城市&#xff0c;使其剩余的城市變成孤立無援&#xff0c;然后再分頭各個擊破。為此參謀部提供了若干打擊方案。本題就請你編寫程序&#xff0c;判斷每個方案的可…

Arduino示例代碼講解:Knock Sensor 敲擊感知器

Arduino示例代碼講解:Knock Sensor 敲擊感知器 Knock Sensor 敲擊感知器功能概述硬件部分:軟件部分:代碼逐行解釋定義常量定義變量`setup()` 函數`loop()` 函數工作原理Knock Sensor 敲擊感知器 這段代碼是一個Arduino示例程序,用于檢測敲擊聲。它通過讀取一個壓電元件(p…

【百日精通JAVA | SQL篇 | 第三篇】 MYSQL增刪改查

SQL得最核心就是增刪改查 一個后端開發&#xff0c;在工作中&#xff0c;最常見的場景就是CRUD。 插入數據 insert into student values (1,zhangsan); 指定列插入數據 同時多個列明之間使用逗號&#xff0c;來分割 insert into student (name) values (zhaoliu); 這個黑框…

ggscitable包通過曲線擬合深度挖掘一個陌生數據庫非線性關系

很多新手剛才是總是覺得自己沒什么可以寫的&#xff0c;自己不知道選什么題材進行分析&#xff0c;使用scitable包ggscitable包后這個完全不用擔心&#xff0c;選題多到你只會擔心你寫不完&#xff0c;寫得不夠快。 既往咱們使用scitable包交互效應深度挖掘一個陌生數據庫&…

ctfshow VIP題目限免 版本控制泄露源碼2

根據題目提示是版本控制泄露源碼 版本控制&#xff08;Version Control&#xff09;是一種在軟件開發和其他領域中廣泛使用的技術&#xff0c;用于管理文件或項目的變更歷史。 主流的版本控制工具&#xff1a; ?Git?&#xff1a;目前最流行的分布式版本控制系統。?SVN?&am…

2025-04-05 吳恩達機器學習5——邏輯回歸(2):過擬合與正則化

文章目錄 1 過擬合1.1 過擬合問題1.2 解決過擬合 2 正則化2.1 正則化代價函數2.2 線性回歸的正則化2.3 邏輯回歸的正則化 1 過擬合 1.1 過擬合問題 欠擬合&#xff08;Underfitting&#xff09; 模型過于簡單&#xff0c;無法捕捉數據中的模式&#xff0c;導致訓練誤差和測試誤…

如何用人工智能大模型,進行作業批改?

今天我們學習人工智能大模型如何進行作業批改。手把手學習視頻請訪問https://edu.csdn.net/learn/40402/666452 第一步&#xff0c;進入訊飛星火。打開google瀏覽器&#xff0c;輸入百度地址后&#xff0c;搜索”訊飛星火”&#xff0c;在搜索的結果中&#xff0c;點第一個訊飛…

C++學習筆記之 模板|函數模板|類模板

函數模板 類模板 定義&#xff1a;函數模板是建立一個通用函數&#xff0c;它所用到的數據的類型&#xff08;包括返回值類型、形參類型、局部變量類型 &#xff09;可以不具體指定&#xff0c;而是用一個虛擬的類型來代替&#xff08;用標識符占位&#xff09;&#xff0c;在…

正則入門到精通

? 一、正則表達式入門? 正則表達式本質上是一串字符序列&#xff0c;用于定義一個文本模式。通過這個模式&#xff0c;我們可以指定要匹配的文本特征。例如&#xff0c;如果你想匹配一個以 “abc” 開頭的字符串&#xff0c;正則表達式可以寫作 “^abc”&#xff0c;其中 …

對備忘錄模式的理解

對備忘錄模式的理解 一、場景1、題目【[來源](https://kamacoder.com/problempage.php?pid1095)】1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 輸入示例1.5 輸出示例 2、理解需求 二、不采用備忘錄設計模式1、代碼2、問題3、錯誤的備忘錄模式 三、采用備忘錄設計模式1、代碼1.1 …

86.方便的double轉string屬性 C#例子 WPF例子

在C#開發中&#xff0c;屬性封裝是一種常見的設計模式&#xff0c;它可以幫助我們更好地控制數據的訪問和修改&#xff0c;同時提供更靈活的功能擴展。今天&#xff0c;我們就來探討一個簡單而優雅的屬性封裝示例&#xff1a;Power 和 PowerFormatted。 1. 問題背景 在實際開…

bun 版本管理工具 bum 安裝與使用

在使用 node 的過程中&#xff0c;我們可能會因為版本更新或者不同項目的要求而頻繁切換 node 版本&#xff0c;或者是希望使用更簡單的方式安裝不同版本的 node&#xff0c;這個時候我們一般會用到 nvm 或者類似的工具。 在我嘗試使用 bun 的時候&#xff0c;安裝前第一個想到…

GRE,MGRE

GRE&#xff1a;靜態過程&#xff0c;有局限性 R1 &#xff1a; [r1]interface Tunnel 0/0/0 --- 創建一個虛擬的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 --- 給隧道接口分配一個 IP 地址 [r1-Tunnel0/0/0]tunnel-protocol gre --- 定義接口的封裝方式 [r1-Tun…

游戲無法啟動?XINPUT1_3.dll 丟失的終極解決方案

當你興奮地啟動一款新游戲時&#xff0c;突然彈出一個錯誤提示——‘程序無法啟動&#xff0c;因為計算機中丟失 XINPUT1_3.dll’。這種問題在 PC 玩家中非常常見&#xff0c;尤其是運行一些較老的游戲時。XINPUT1_3.dll 是 DirectX 運行庫的關鍵組件&#xff0c;缺失會導致游戲…

用大語言模型學文學常識

李白的詩句“右軍本清真”中的“清真”并非指伊斯蘭教信仰&#xff0c;而是對王羲之&#xff08;王右軍&#xff09;人格和藝術境界的贊美。以下是對這一問題的詳細分析&#xff1a; “清真”的古代含義 在魏晉至唐代的語境中&#xff0c;“清真”一詞多用于形容人的品格高潔、…

css炫酷的3D水波紋文字效果實現詳解

炫酷的3D水波紋文字效果實現詳解 這里寫目錄標題 炫酷的3D水波紋文字效果實現詳解項目概述技術棧核心實現1. 基礎布局2. 漸變背景3. 文字效果實現3.1 基礎樣式3.2 文字漂浮動畫 4. 水波紋效果4.1 模糊效果4.2 水波動畫 5. 交互效果 技術要點項目難點與解決方案總結 項目概述 在…

八、重學C++—動態多態(運行期)

上一章節&#xff1a; 七、重學C—靜態多態&#xff08;編譯期&#xff09;-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146999362?spm1001.2014.3001.5502 本章節代碼&#xff1a; cpp/dynamicPolymorphic.cpp CuiQingCheng/cppstudy - 碼云 - 開源中…

eventEmitter實現

沒有做任何異常處理,簡單模擬實現 事件對象的每一個事件都對應一個數組 /*__events {"事件1":[cb1,cb2],"事件2":[cb3,cb4],"事件3":[...],"事件4":[...],};*/class E{__events {};constructor(){}//注冊監聽回調on(type , callbac…

Mysql 中 B 樹 vs B+ 樹

&#x1f333; 什么是 B樹 和 B樹&#xff1f; 它們都是多路平衡查找樹&#xff08;M-Way Search Tree&#xff09;&#xff0c;用于提升磁盤讀寫效率&#xff0c;常用于數據庫&#xff08;如 MySQL&#xff09;、操作系統中的索引結構。 &#x1f50d; B樹 和 B樹 的核心區別…