Linux線程屬性與多線程開發:API詳解與實戰代碼解析

Linux 線程的屬性 線程池 多線程的創建

線程的屬性

引入

我們設想一個場景,使用pthread_detach時,發現線程早就已經結束了,這時候pthread_detach還能正常發揮清理線程的 獨有空間 的作用嗎?

答案是可以的,但是這難免是一個 程序設計上的一個小缺陷,雖不影響結果,但是總是讓人感到困惑。為了解決這一問題,我們可以在 線程屬性?中進行對應設置。下面我們來學習一下如何操作線程屬性吧!

這里再次提醒,當我們屬性設置了detach或者調用了pthread_detach后,就不可以再使用pthread_join函數了。

介紹

typedef struct

{

????????int etachstate; //線程的分離狀態

????????int schedpolicy; //線程調度策略

????????struct sched_param schedparam; //線程的調度參數

????????int inheritsched; //線程的繼承性

????????int scope; //線程的作用域

????????size_t guardsize; //線程棧末尾的警戒緩沖區大小

????????int stackaddr_set; //線程的棧設置

????????void* stackaddr; //線程棧的位置

????????size_t stacksize; //線程棧的大小

} pthread_attr_t;

可以看到,線程屬性是一個結構體,其中包含的成員也有很多,但查看和修改步驟都大同小異,下面我主要向大家展示 分離狀態 和 棧 屬性的 查看和修改。

線程屬性設置API

初始化線程屬性函數:

int pthread_attr_init(pthread_attr_t *attr);

函數返回值:

????????成功:0

????????失敗:錯誤號

銷毀線程屬性所占用的資源函數:

int pthread_attr_destroy(pthread_attr_t *attr);

函數返回值:

????????成功:0

????????失敗:錯誤號

設置線程屬性,分離or非分離

1 int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

獲取程屬性,分離or非分離

1 int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstat);

參數:

????????attr:已初始化的線程屬性

????????detachstate: 分離狀態

????????????????PTHREAD_CREATE_DETACHED(分離線程)

????????????????PTHREAD_CREATE_JOINABLE(非分離線程)

線程設置的步驟

????????1、獲取

????????2、修改

????????3、設置

代碼練習

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define SIZE 128
void *th_fun(void *arg)
{while (1)sleep(1);
}
int main(void)
{pthread_t tid;int err, detachstate, i = 1;pthread_attr_t attr;size_t stacksize;void *stackaddr;// 初始化線程屬性pthread_attr_init(&attr);// 設置線程的屬性值為分離狀態pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);while (1){stackaddr = malloc(SIZE);if (stackaddr == NULL){perror("malloc");_exit(-1);}stacksize = SIZE;// 將棧的地址 和棧的大小設置到線程屬性值里pthread_attr_setstack(&attr, stackaddr, stacksize);// 將上面設置好的線程屬性值 賦值到 創建的線程中err = pthread_create(&tid, &attr, th_fun, NULL);if (err != 0){perror("pthread_create");_exit(-1);}printf("%d\n", i++);sleep(1);}pthread_attr_destroy(&attr);return 0;
}
代碼運行結果

我們可以看到主線程正常運行,說明子線程,線程已經是 分離狀態了。

在這里,我想向大家引入一下進程池的概念。

在上面這個例子中,大家可以看到我是在堆區 為棧 申請的空間,這樣的好處是,堆區空間較大可以增加一個進程中最大可容納的線程數目,但是堆區再大,也會有被用完的時候,并且這里 線程申請的空間你不釋放,就永遠不會歸還給系統,相當于一塊空間只是用一次,空間資源利用率較低,因此為了提高線程的最大容納數目和提高空間利用率,線程池就這樣誕生了:

線程池

這里我簡單提一下,大家心里有數就行:

我們把在一個區域內,存放著多個線程,我們可以從這個里取線程,但用完需要歸還,這樣當我們取和還的數目近似時,幾乎就可以無限使用;而不是像現在一樣用了不還,只能等到線程回收。并且這個區域還有一個功能是會根據你的任務數量變化去設置區域中的線程的數目。而這個區域就是線程池。

線程池我之后會詳細介紹,這里大家只需知道這個概念即可。

多線程案例

需要實現的功能

輸入線程名,該與線程執行的時間。對應的線程就會執行對應時間長度,并且可以在線程運行期間,加入其他線程,多個線程一起運行。

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{char task_name[32];int time;
} MSG;void *deal_fun(void *arg)
{MSG msg = *(MSG *)arg;int i = 0;for (i = msg.time; i > 0; i--){printf("%s剩余時間%d\n", msg.task_name, i);sleep(1);}return NULL;
}
int main(int argc, char const *argv[])
{while (1){MSG msg;printf("輸入新增的任務名:");fgets(msg.task_name, sizeof(msg.task_name), stdin);msg.task_name[strlen(msg.task_name) - 1] = 0;printf("輸入運行時間:");scanf("%d", &msg.time);getchar(); // 獲取換行符pthread_t tid;pthread_create(&tid, NULL, deal_fun, (void *)&msg);pthread_detach(tid); // 線程分離}return 0;
}

代碼運行結果

結束

代碼重在練習!

代碼重在練習!

代碼重在練習!

今天的分享就到此結束了,希望對你有所幫助,如果你喜歡我的分享,請點贊收藏夾關注,謝謝大家!!!

博客內容源自課堂筆記,因此偏向于教學,適合新人學習 和 大佬復習,感謝你的閱讀!

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

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

相關文章

測試第二課-------測試分類

作者前言 &#x1f382; ??????&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ?&#x1f382; 作者介紹&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

MySQL安裝實戰分享

一、在 Windows 上安裝 MySQL 1. 下載 MySQL 安裝包 訪問 MySQL 官方下載頁面。選擇適合你操作系統的版本。一般推薦下載 MySQL Installer。 2. 運行安裝程序 雙擊下載的安裝文件&#xff08;例如 mysql-installer-community-<version>.msi&#xff09;。如果出現安全…

數據庫預熱

介紹 Database Warm-up &#x1f9e0; 一句話理解 數據庫是在應用啟動階段&#xff0c;提前建立數據庫連接 或 執行輕量 SQL 操作&#xff0c;從而 加快首個請求的響應速度 的一種優化手段 &#x1f3af; 為什么需要數據庫預熱&#xff1f; 當 FastAPI 或其他 Web 服務剛啟…

SearXNG

SearXNG 什么是 SearXNG &#xff1f;說白了&#xff0c;其實就是一個免費開源的搜索引擎。那為什么要本地安裝它呢&#xff1f; 看它官網的解釋(翻譯)&#xff0c;當然&#xff0c;其中官方也有一篇文檔解釋了為什么需要部署使用私有示例&#xff1a;為什么使用私有實例&…

js 顏色轉換分析

一、十六進制轉RGB function hexToRgba(hex) {// 移除 # 字符hex hex.replace(#, );// 處理簡寫形式如 #fffif (hex.length 3) {hex hex[0] hex[0] hex[1] hex[1] hex[2] hex[2];}// 轉換為十進制const r parseInt(hex.substring(0, 2), 16); // 截圖前兩位&#xff0…

智能資源管理機制-重傳機制

一、發送端資源管理的核心機制 1. 滑動窗口&#xff08;Sliding Window&#xff09; 這是TCP協議的核心優化設計&#xff1a; 窗口動態滑動&#xff1a;發送端不需要保留所有已發送的分組&#xff0c;只需維護一個"發送窗口"窗口大小&#xff1a;由接收方通告的接…

基于SSM+Layui畢業設計選題系統源碼

項目介紹 基于SSM+Layui畢業設計選題系統源碼,可以作為課程設計項目參考,該系統分為三個角色: 管理員:用戶管理(對學生和老師的信息進行維護),統計分析(對老師課題情況以及學生選題情況信息進行維護),修改密碼 老師:個人信息維護,畢業設計題目管理,報名學生管理…

通過uri獲取文件路徑手機適配

青銅版本 return contentResolver.query(this, arrayOf(MediaStore.MediaColumns.DATA), null, null).let {if (it?.moveToFirst() true) {val columnIndex it.getColumnIndex(MediaStore.MediaColumns.DATA)val path it.getString(columnIndex)it.close()return path}&quo…

vue模擬撲克效果

vue模擬撲克效果 效果圖&#xff1a; step1:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\Home.vue <template><div class"poker-container"><!-- 使用復合數據對象實現雙行顯示 --><divv-for"(card, index) in POKER_…

基礎數學:圖論與信息論

微積分與概率論由此進&#xff1a;基礎數學&#xff1a;微積分和概率與統計-CSDN博客 線代與優化理論由此進&#xff1a;基礎數學&#xff1a;線性代數與優化理論-CSDN博客 數值分析與離散數學由此進&#xff1a;基礎數學&#xff1a;數值分析與離散數學-CSDN博客 四、圖論與…

構建智能期貨交易策略分析應用:MCP與AI的無縫集成

引言 隨著金融科技的快速發展&#xff0c;數據驅動的交易決策已成為期貨交易領域的重要趨勢。本文將深入探討一個結合了Model Content Protocol (MCP)和AI技術的期貨交易策略分析應用——Futures MCP。該應用不僅提供了豐富的技術分析工具&#xff0c;還通過MCP協議與大型語言…

0x02.Redis 集群的實現原理是什么?

回答重點 Redis 集群&#xff08;Redis cluster&#xff09;是通過多個 Redis 實例組成的&#xff0c;每個主節點實例負責存儲部分的數據&#xff0c;并且可以有一個或多個從節點作為備份。 具體是采用哈希槽&#xff08;Hash Slot&#xff09;機制來分配數據&#xff0c;將整…

基本的DOS命令

一.打開CMD方式&#xff1a; winR 輸入cmd 開始系統命令提示符 在任意文件夾下&#xff0c;shift&#xff0b;鼠標右擊&#xff0c;在此處打開命令 資源管理器的地址欄前面輸入cmd 以管理員身份打開cmd&#xff1a;選擇以管理員方式運行 二.常用的Dos命令 #盤符切換 盤符…

深度剖析:架構評估的常用方法與應用

架構評估是確保系統架構滿足需求、性能和質量等方面要求的重要環節&#xff0c;以下是一些常見的架構評估方法的詳細介紹&#xff1a; 一、基于調查問卷或檢查表的評估方法 1.方法概述&#xff1a;該方法通過設計一系列針對性的問題或檢查項&#xff0c;形成問卷或檢查表&…

代碼隨想錄算法訓練營第十六天

LeetCode題目: 530. 二叉搜索樹的最小絕對差501. 二叉搜索樹中的眾數236. 二叉樹的最近公共祖先3272. 統計好整數的數目(每日一題) 其他: 今日總結 往期打卡 530. 二叉搜索樹的最小絕對差 跳轉: 530. 二叉搜索樹的最小絕對差 學習: 代碼隨想錄公開講解 問題: 給你一個二叉搜…

基于雙閉環PID控制器的永磁同步電機控制系統匝間故障Simulink仿真

歡迎微?關注“電擊小子程高興的MATLAB小屋”獲取巨額優惠 1.模型簡介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2013Rb&#xff09;軟件。建議采用matlab2013 Rb及以上版本打開。&#xff08;若需要其他版本可聯系代為轉換&#xff0c;高于該版本的matlab均可正…

02-libVLC的視頻播放器:播放音視頻文件以及網絡流

libvlc_new(0, nullptr)功能:創建并初始化libVLC的核心實例,是使用所有libVLC功能的前提。 參數:第一個參數:參數數量(通常設為0)第二個參數:參數列表(通常為nullptr,表示使用默認配置)返回值:成功返回libvlc_instance_t*指針,失敗返回nullptr。注意事項:可通過參…

2025藍橋杯省賽C++B組解題思路

由于題面還沒出來&#xff0c;現在先口胡一下思路 填空題直接打表找規律或者亂搞一下就能出&#xff0c;從大題開始說。 1&#xff0c;題意&#xff1a; 給你一個數組&#xff0c;這個數組里有幾個數可以被一個連續遞增的數字區間求和得出 思路&#xff1a;詐騙題&#xff0c;顯…

防止郵件偽造的策略 SPF 介紹

SPF是Sender Policy Framework的縮寫&#xff0c;即發件人策略框架&#xff0c;是一種用于防止電子郵件偽造的技術&#xff0c;用來驗證發件人郵箱域名的真實性。以下是關于它的詳細說明&#xff1a; 1. 定義與作用 SPF是一種電子郵件驗證系統&#xff0c;它通過在域名的DNS記…

JavaScript Symbol與BigInt

目錄 Symbol類型 一、Symbol 的核心特性 1. 唯一性 2. 不可變性 3. 不可枚舉性 二、創建 Symbol 1. 基礎創建 2. 全局 Symbol 注冊表 三、Symbol 作為對象屬性 1. 定義 Symbol 屬性 2. 遍歷 Symbol 屬性 四、內置 Symbol 值 五、實際應用場景 1. 避免屬性名沖突 …