LIUNX學習-線程

?線程概念

一個進程需要訪的大部分資源,諸如自身的代碼、數據、new\malloc的空間數據、命令行參數和環境變量、動態庫、甚至是系統調用訪問內核代碼…都是通過虛擬地址空間來訪問的。換而言之,進程地址空間是進程的資源窗口!!
?? ?進程創建費時費力。在創建時,我們需要為進程創建PCB、地址空間、頁表、將進程自身的代碼和數據換入內存并建立映射、將進程PCB狀態改為R狀態、添加帶運行隊列中…??但如果現在已經存在一個線程了,我僅僅將進程PCB復制多份,然后讓所有“進程”PCB全部指向同一個虛擬地址空間。然后通過技術手段,將虛擬地址空間合理分配給每一個“進程”。當CPU調度執行該“”進程“時,只會執行原本進程中的一部分代碼和數據,執行我們要執行任務的一部分任務,我們將這種比傳統“進程”更加輕量化的進程就稱為線程!!

主線程和子線程
共享:
.text
.bss
.data
動態加載區
環境變量
命令行參數
-通信:全局變量,堆
不共享
一共五個線程,棧區被平均分成五塊
Linux下: 線程就是進程-輕量級進程
對于內核來貨,線程就是進程
多進程和多線程的區別:
多進程: 始終共享的資源 代碼、文件描述符、內存映射區--mmap
多線程:始終共享的資源:堆、全局變量,節省資源
查看指定線程的LWP號:
線程號和線程ID是有區別的
線程號是給內核看的
查看方式
找到程序的進程ID
ps -Lf pid
線程的創建

?

#include <stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
void * myfunc(void *arg)
{printf("child pthread id : %ld\n",pthread_self());
}
int main()
{pthread_t  pthid;int ret;ret=pthread_create(&pthid,NULL,myfunc,NULL);if(ret!=0){printf("error number is %d\n",ret);printf("%s\n",strerror(ret));}printf("parent pthread id : %ld\n",pthread_self());for(int i=0;i<5;i++){printf("i=%d\n",i);}sleep(2);return 0;
}

使用sleep()函數先防止主函數1進程結束,導致子進程消失

單個線程退出 --pthread_exit

#include <stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
void * myfunc(void *arg)
{printf("child pthread id : %ld\n",pthread_self());exit(0);
}
int main()
{pthread_t  pthid;int ret;int i=0;ret=pthread_create(&pthid,NULL,myfunc,NULL);if(ret!=0){printf("error number is %d\n",ret);printf("%s\n",strerror(ret));}printf("parent pthread id : %ld\n",pthread_self());while(i<10){printf("i=%d\n",i);i++;}pthread_exit(NULL);sleep(2);return 0;
}

?

阻塞等待線程退出,獲取線程退出狀態--pthread_join
#include <stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int num=100;
void * myfunc(void *arg)
{printf("child pthread id : %ld\n",pthread_self());
//      exit(0);for(int i=0;i<5;i++){printf("child pthread %d\n",i);}pthread_exit(&num);
}
int main()
{pthread_t  pthid;int ret;int i=0;ret=pthread_create(&pthid,NULL,myfunc,NULL);if(ret!=0){printf("error number is %d\n",ret);printf("%s\n",strerror(ret));}printf("parent pthread id : %ld\n",pthread_self());void*ptr=NULL;pthread_join(pthid,&ptr);printf("num=%d\n",*(int*)ptr);while(i<10){printf("i=%d\n",i);i++;}sleep(2);return 0;
}

?

?線程分離--pthread_detach

殺死(取消)線程--pthread_cancel

比較兩個線程ID是否相等(預留函數) --pthread_equal?

線程的分離屬性

1.分離屬性是屬于線程的屬性,有了分離屬性的線程,是不需要別的線程去接合自己的(回收自己的資源)。
但是雖然是分離的,但是如果進程退出,該線程還是會退出的。

2.分離屬性的特點

該線程的資源,不需要被別的線程回收(接合),資源是由系統來回收的。

分離屬性 ? ?--> ?不需要被的線程去調用pthread_join()來回收資源。
非分離屬性 ?--> ?需要被別的線程去調用pthread_join來回收資源。

通過屬性設置線程的分離
1.線程屬性類型: pthread_attr_t attr;
2.線程屬性操作函數:
對線程屬性變量的初始化
int pthread_attr_init(pthread_attr_t* attr);
設置線程分離屬性
int pthread_attr_setdetachstate(
pthread_attr_t* attr,
int detachstate
);
參數:
attr : 線程屬性
detachstate
PTHREAD_CREATE_DETACHED(分離)
PTHREAD_CREATE_JOINABLE(非分離)
釋放線程資源函數
int pthread_attr_destroy(pthread_attr_t* attr)
#include <stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
void * myfunc(void *arg)
{printf("child pthread id : %ld\n",pthread_self());
}
int main()
{pthread_t  pthid;int ret;pthread_attr_t arr;pthread_attr_init(&arr);pthread_attr_setdetachstate(&arr,PTHREAD_CREATE_DETACHED);ret=pthread_create(&pthid,&arr,myfunc,NULL);if(ret!=0){printf("error number is %d\n",ret);printf("%s\n",strerror(ret));}printf("parent pthread id : %ld\n",pthread_self());for(int i=0;i<5;i++){printf("i=%d\n",i);}sleep(2);pthread_attr_destroy(&arr);return 0;
}

?

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

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

相關文章

1.Big-endian/ little endian大端對齊、小端對齊

一、大端模式、小端模式的介紹 Little endian&#xff1a;是低位字節排放在內存的低地址端、高位字節排放在內存的高地址端。 Big-endian&#xff1a;是高位字節排放在內存的低地址端、低位字節排放在內存的高地址端。 西門子是大端模式&#xff0c;因為比如 MW100 MB100(高位…

[mybatis]resultMap詳解

resultMap Mybatis中提供了resultMap功能&#xff0c;可以將數據庫查詢結果映射到Java對象&#xff0c;用于解決 字段名與屬性名不一致 或 復雜關系&#xff08;如一對多&#xff09;的映射問題。 比如一個User類&#xff0c;在它的屬性里還有另一個子對象&#xff08;或者多…

SpringBoot Actuator

SpringBoot Actuator 一、簡介二、入門1、依賴2、默認監控指標3、查詢監控指標4、全量監控指標 三、Spring Boot Admin1、主要功能2、Admin3、Client4、應用墻5、其他 四、定制化1、定制Health端點2、定制Info端點3、定制Metrics端點4、定制Endpoint端點 一、簡介 SpringBoot自…

python標識符

在 Python 中&#xff0c;標識符&#xff08;Identifier&#xff09;是指用來標識變量、函數、類、模塊等的名稱。標識符的命名規則如下&#xff1a; 1. 標識符的命名規則 字母、數字和下劃線&#xff1a;標識符可以由字母&#xff08;a-z, A-Z&#xff09;、數字&#xff08;…

06 HarmonyOS Next性能優化之LazyForEach 列表渲染基礎與實現詳解 (一)

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; 目錄 一、代碼結構概覽二、詳細代碼解析1. 數據源管理實現2. 數據結構定義3. 優化的列表項組件4. 主列表組件實現 一、代碼結構概覽 本文將詳細解…

vscode 查看3d

目錄 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 沒找到這個插件&#xff1a; 3. 3D Viewer for Vscode 查看obj失敗 1. vscode-3d-preview obj查看ok 可以查看obj 顯示過程&#xff1a;開始是綠屏&#xff0c;過了1到2秒&#xff0c;后來就正常看了。 2. vsc…

excel 斜向拆分單元格

右鍵-合并單元格 右鍵-設置單元格格式-邊框 在設置好分割線后&#xff0c;你可以開始輸入文字。 需要注意的是&#xff0c;文字并不會自動分成上下兩行。 為了達到你期望的效果&#xff0c;你可以通過 同過左對齊、上對齊 空格鍵或使用【AltEnter】組合鍵來調整單元格中內容的…

家政保潔維修行業有沒有必要做小程序?

【家政創業必看】家政行業小程序值得做嗎&#xff1f;4大核心優勢告訴你&#xff01; 隨時隨地下單&#xff1a;客戶手機一鍵預約&#xff0c;告別找電話/翻頁面的麻煩 品牌專業升級&#xff1a;精美界面服務詳情用戶評價&#xff0c;打造可信賴形象 營銷神器&#xff1…

利用Python爬蟲按圖搜索1688商品(拍立淘)

在電商領域&#xff0c;按圖搜索商品&#xff08;拍立淘&#xff09;已成為一種重要的功能&#xff0c;尤其適合用戶通過圖片快速查找相似商品。1688開放平臺提供了按圖搜索商品的API接口&#xff0c;允許開發者通過圖片獲取相關的商品信息。本文將詳細介紹如何使用Python爬蟲技…

20250305隨筆 HTML2Canvas 詳解與使用指南

1. 簡介 html2canvas 是一個用于將 HTML 頁面或特定 DOM 元素轉換為 Canvas 畫布的 JavaScript 庫。它通過解析 HTML 和 CSS&#xff0c;生成等效的 Canvas 圖像&#xff0c;從而實現網頁截圖功能。 2. 安裝 可以使用 npm 或 yarn 安裝 html2canvas&#xff0c;也可以通過 C…

【初探數據結構】鏈表OJ算法——哨兵位(合并兩個有序鏈表詳解)

文章目錄 哨兵位&#xff08;Sentinel Node&#xff09;的作用實戰演練思路講解詳細步驟1. **處理特殊情況&#xff08;邊界條件&#xff09;**2. **創建哨兵節點**3. **初始化兩個指針&#xff0c;遍歷兩個鏈表**4. **合并兩個鏈表**5. **處理剩余節點**6. **返回合并后的鏈表…

libcoap在Ubuntu下的編譯(基于CMake)

引言 libcoap 是一個開源的輕量級 C 語言庫&#xff0c;用于實現 CoAP&#xff08;Constrained Application Protocol&#xff0c;受限應用協議&#xff09;。CoAP 是一種專為資源受限設備設計的輕量級通信協議&#xff0c;適用于物聯網&#xff08;IoT&#xff09;和嵌入式系…

命名管道實現傳遞數據到二進制文件

一 前言&#xff1a; 在做項目的過程中&#xff0c;一般來說我們的信息輸入是有固定的端口/來源的&#xff0c;但是在當前的越來越快的開發節奏下&#xff0c;往往會出現輸入源還未完全確定的情況下需要我們先實現功能邏輯&#xff0c;信號接受端后面再對接。或者數據接受端和功…

VSCode知名主題帶毒 安裝量900萬次

目前微軟已經從 Visual Studio Marketplace 中刪除非常流行的主題擴展 Material Theme Free 和 Material Theme Icons&#xff0c;微軟稱這些主題擴展包含惡意代碼。 統計顯示這些擴展程序的安裝總次數近 900 萬次&#xff0c;在微軟實施刪除后現在已安裝這些擴展的開發者也會…

如何快速的解除oracle dataguard

有些時候&#xff0c;我們為了使oracle dg的standby庫另做他用&#xff0c;需要解除oracle dataguard數據同步。我本地因為standby庫存儲出現故障&#xff0c;導致dg存在問題&#xff0c;故需要解除。今天&#xff0c;我們通過使用部分命令&#xff0c;實現dg的快速解除。 1&a…

Windows系統編程(七)HotFixHook

InoolineHook需要讀寫兩次內存&#xff08;先HOOK&#xff0c;再還原&#xff09;&#xff0c;這種Hook方式&#xff0c;性能比較低&#xff0c;具有局限性。今天所講的HotFixHOOK&#xff08;熱補丁&#xff09;是InlineHook的升級版 Win32 API特殊性 Win32API的實現代碼有這…

Python Web應用開發之Flask框架——基礎

一、前言 在即將開啟的 Flask 學習之旅中,為了能夠順利掌握并運用 Flask 進行 Web 開發,您需要具備一定的基礎知識,同時了解相應的運行環境。 需要你具備的知識:Python 編程語言、HTML、CSS、HTTP協議、數據庫(如:MySQL、MongoDB) 本文所使用的環境:操作系統Windows…

TCP通訊與基于C#TCP通訊,跨窗收發消息Demo

TCP&#xff08;傳輸控制協議&#xff09;是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。它廣泛應用于互聯網中的數據通信&#xff0c;如網頁瀏覽、文件傳輸、電子郵件等。以下是TCP通信的基本概念和工作原理&#xff1a; 1. TCP的特點 面向連接&#xff1a;通信前…

【有源碼】仿DeepSeek問答網站+SpringBoot+VUE3+對接DeepSeek API

今天帶來一款優秀的項目&#xff1a;仿DeepSeek問答網站。 功能和官網差不多&#xff0c;也有歷史上下文&#xff0c;流失對話等。 本文介紹了系統功能與部署安裝步驟&#xff0c;如果您有任何問題&#xff0c;也請聯系學姐&#xff0c;偶現在是經驗豐富的程序員&#xff01; …

Ubuntu20.04雙系統安裝及軟件安裝(七):Anaconda3

Ubuntu20.04雙系統安裝及軟件安裝&#xff08;七&#xff09;&#xff1a;Anaconda3 打開Anaconda官網&#xff0c;在右側處填寫郵箱&#xff08;要真實有效&#xff01;&#xff09;&#xff0c;然后Submit。會出現如圖示的Success界面。 進入填寫的郵箱&#xff0c;有一封Ana…