線程屬性設置全攻略

目錄

一、線程屬性的概念

二、線程屬性的核心函數

1.?初始化與銷毀線程屬性對象

2.?常用屬性設置函數

三、線程屬性的設置示例

1.?設置線程為分離狀態

2.?設置線程棧大小

3.?設置線程調度策略和優先級

四、線程屬性的關鍵注意事項

1.?分離狀態(Detached State)

2.?棧大小(Stack Size)

3.?調度策略與優先級

4.?繼承調度屬性(Inherit Scheduler)

五、常見問題與解決方案

1.?線程棧溢出

2.?線程無法創建(資源不足)

3.?調度策略設置失敗

六、線程屬性設置的性能優化

七、總結


一、線程屬性的概念

線程屬性是 線程創建時可配置的參數,用于定制線程的行為和資源分配。通過設置線程屬性,可以控制線程的棧大小、分離狀態、調度策略、優先級等,從而優化程序性能和資源使用。


二、線程屬性的核心函數

1.?初始化與銷毀線程屬性對象

#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
  • 作用
    • pthread_attr_init:初始化線程屬性對象(默認值為系統默認屬性)。
    • pthread_attr_destroy:釋放線程屬性對象占用的資源。

2.?常用屬性設置函數

函數作用
pthread_attr_setdetachstate設置線程的分離狀態(PTHREAD_CREATE_JOINABLE?或?PTHREAD_CREATE_DETACHED)。
pthread_attr_getdetachstate獲取線程的分離狀態。
pthread_attr_setstacksize設置線程的棧大小。
pthread_attr_getstacksize獲取線程的棧大小。
pthread_attr_setschedpolicy設置線程的調度策略(如?SCHED_FIFO,?SCHED_RR,?SCHED_OTHER)。
pthread_attr_getschedpolicy獲取線程的調度策略。
pthread_attr_setschedparam設置線程的調度參數(如優先級)。
pthread_attr_getschedparam獲取線程的調度參數。
pthread_attr_setinheritsched設置線程是否繼承創建者的調度策略(PTHREAD_INHERIT_SCHED?或?PTHREAD_EXPLICIT_SCHED)。
pthread_attr_getinheritsched獲取線程的調度繼承模式。

三、線程屬性的設置示例

1.?設置線程為分離狀態

#include <stdio.h>
#include <pthread.h>void* thread_function(void* arg) {printf("Thread is running.\n");return NULL;
}int main() {pthread_t thread_id;pthread_attr_t attr;// 初始化屬性對象pthread_attr_init(&attr);// 設置分離狀態pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);// 創建線程int ret = pthread_create(&thread_id, &attr, thread_function, NULL);if (ret != 0) {perror("pthread_create failed");return 1;}// 分離線程無需調用 pthread_joinprintf("Main thread continues.\n");// 銷毀屬性對象pthread_attr_destroy(&attr);return 0;
}

2.?設置線程棧大小

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>#define STACK_SIZE (1024 * 1024) // 1MB 棧大小void* thread_function(void* arg) {char buffer[1024 * 1024]; // 模擬棧使用printf("Thread is running.\n");return NULL;
}int main() {pthread_t thread_id;pthread_attr_t attr;void* stack = malloc(STACK_SIZE);if (!stack) {perror("malloc failed");return 1;}// 初始化屬性對象pthread_attr_init(&attr);// 設置棧地址和大小pthread_attr_setstack(&attr, stack, STACK_SIZE);// 創建線程int ret = pthread_create(&thread_id, &attr, thread_function, NULL);if (ret != 0) {perror("pthread_create failed");free(stack);return 1;}// 等待線程結束pthread_join(thread_id, NULL);// 釋放資源free(stack);pthread_attr_destroy(&attr);return 0;
}

3.?設置線程調度策略和優先級

#include <stdio.h>
#include <pthread.h>
#include <sched.h>void* thread_function(void* arg) {struct sched_param param;int policy;pthread_getschedparam(pthread_self(), &policy, &param);printf("Thread priority: %d, Policy: %d\n", param.sched_priority, policy);return NULL;
}int main() {pthread_t thread_id;pthread_attr_t attr;struct sched_param param;// 初始化屬性對象pthread_attr_init(&attr);// 設置調度策略為 SCHED_FIFO(實時優先級)pthread_attr_setschedpolicy(&attr, SCHED_FIFO);// 設置調度繼承模式為顯式指定pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);// 設置優先級(需根據系統支持范圍調整)param.sched_priority = 50;pthread_attr_setschedparam(&attr, &param);// 創建線程int ret = pthread_create(&thread_id, &attr, thread_function, NULL);if (ret != 0) {perror("pthread_create failed");return 1;}// 等待線程結束pthread_join(thread_id, NULL);// 銷毀屬性對象pthread_attr_destroy(&attr);return 0;
}

四、線程屬性的關鍵注意事項

1.?分離狀態(Detached State)

  • PTHREAD_CREATE_JOINABLE(默認):
    • 需要調用?pthread_join?回收資源。
    • 適用于需要獲取線程返回值的場景。
  • PTHREAD_CREATE_DETACHED
    • 線程結束后自動釋放資源。
    • 適用于無需等待線程結果的場景。

2.?棧大小(Stack Size)

  • 默認棧大小:通常為幾 MB(依賴系統配置)。
  • 最小棧大小PTHREAD_STACK_MIN(通常為 2KB)。
  • 設置建議
    • 棧過小可能導致棧溢出。
    • 棧過大可能浪費內存,尤其在創建大量線程時。

3.?調度策略與優先級

  • 調度策略
    • SCHED_OTHER:默認策略,由系統動態調度。
    • SCHED_FIFO:先進先出的實時調度策略。
    • SCHED_RR:輪轉調度的實時策略。
  • 優先級
    • 僅對?SCHED_FIFO?和?SCHED_RR?有效。
    • 需要 root 權限才能設置高優先級線程。
    • 優先級范圍:sched_get_priority_min()?到?sched_get_priority_max()

4.?繼承調度屬性(Inherit Scheduler)

  • PTHREAD_INHERIT_SCHED(默認):
    • 線程繼承創建者的調度策略和優先級。
  • PTHREAD_EXPLICIT_SCHED
    • 顯式指定調度策略和優先級。

五、常見問題與解決方案

1.?線程棧溢出

  • 原因:棧空間不足,局部變量或遞歸調用過深。
  • 解決方案
    • 增加棧大小(pthread_attr_setstacksize)。
    • 避免在棧上分配大數組,改用堆內存。

2.?線程無法創建(資源不足)

  • 原因:系統資源限制(如最大線程數或內存不足)。
  • 解決方案
    • 減少單個線程的棧大小。
    • 使用?ulimit?調整系統限制(如?ulimit -s)。
    • 使用線程池管理線程生命周期。

3.?調度策略設置失敗

  • 原因
    • 未啟用實時調度策略(需 root 權限)。
    • 優先級超出系統支持范圍。
  • 解決方案
    • 使用?sched_get_priority_min()?和?sched_get_priority_max()?查詢合法范圍。
    • 以 root 權限運行程序。

六、線程屬性設置的性能優化

屬性優化建議
棧大小根據線程需求調整,避免過大浪費或過小溢出。
分離狀態對于短期任務使用?PTHREAD_CREATE_DETACHED,避免資源泄漏。
調度策略實時任務使用?SCHED_FIFO?或?SCHED_RR,普通任務使用默認策略。
優先級高優先級線程應謹慎使用,避免搶占系統關鍵資源。
繼承調度屬性顯式設置調度屬性可提高可控性,但需確保一致性。

七、總結

  • 線程屬性設置?是多線程編程中的關鍵部分,直接影響線程的行為和資源使用。
  • 常用屬性?包括分離狀態、棧大小、調度策略和優先級。
  • 注意事項
    • 確保棧大小合理,避免溢出或浪費。
    • 優先級設置需符合系統權限和實時性需求。
    • 分離狀態的選擇應根據是否需要等待線程結果。
  • 錯誤處理:始終檢查線程屬性設置和創建函數的返回值。

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

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

相關文章

蒼穹外賣-day06

蒼穹外賣-day06 課程內容 HttpClient微信小程序開發微信登錄導入商品瀏覽功能代碼 學習目標 能夠使用HttpClient發送HTTP請求并解析響應結果 了解微信小程序開發過程 掌握微信登錄的流程并實現功能代碼 了解商品瀏覽功能需求 功能實現&#xff1a;微信登錄、商品瀏覽 1. H…

安卓定制功能

未解決的定制功能 1.創建自定義分區 2.通過服務啟動應用進程 3.應用白名單 4.網絡白名單 5.應用鎖 6.默認launcher 7.多主頁動態切換 8.禁止狀態欄下拉/鎖屏頁面禁止下拉狀態欄&#xff08;兩種一起&#xff09; 9.導航欄動態打開關閉 10.固件默認是手勢還是導航欄 11.狀態欄動…

【項目】GraphRAG基于知識圖譜的檢索增強技術-實戰入門

GraphRAG—基于知識圖譜的檢索增強技術&#xff08;一&#xff09;GraphRAG入門介紹&#xff08;二&#xff09;GraphRAG基本原理回顧&#xff08;三&#xff09;GraphRAG運行流程3.1 索引&#xff08;Indexing&#xff09;過程3.2 查詢&#xff08;Query&#xff09;過程3.3 P…

Zookeeper添加SASL安全認證 修復方案

#作者&#xff1a;任少近 文章目錄1修復背景2 修復方案說明3 配置流程3.1停止zookeeper服務3.2Zookeeper添加SASL參數3.3配置jaas密碼文件3.4 添加啟動參數3.5啟動zookeeper服務3.6訪問測試4 Kafka連接zookeeper服務端配置4.1未配置身份認證4.2停止kafka服務4.3配置身份認證4.4…

AI進化論07:第二次AI寒冬——AI“改頭換面”,從“AI”變成“機器學習”

書接上回&#xff0c;上回咱們聊了神經網絡在第一次寒冬中的“蟄伏”與“萌動”。但別高興太早&#xff0c;AI很快就迎來了它的第二次“寒冬”&#xff08;大概從20世紀80年代末到90年代中期&#xff09;。這次寒冬啊&#xff0c;比第一次還“冷”&#xff0c;還“漫長”。AI這…

基于開源AI智能名片鏈動2+1模式與S2B2C商城小程序的渠道選擇策略研究

摘要&#xff1a;在數字化商業環境下&#xff0c;品牌與產品的渠道選擇對其市場推廣和運營成功至關重要。本文聚焦于如何依據自身品牌和產品特性&#xff0c;結合開源AI智能名片鏈動21模式與S2B2C商城小程序&#xff0c;運用科學的渠道選擇方法&#xff0c;慎重挑選1 - 2個適宜…

開源 C# .net mvc 開發(八)IIS Express輕量化Web服務器的配置和使用

文章的目的為了記錄.net mvc學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發文件系統&#xff0c;臨時進行學習開發&#xff0c;系統上線3年未出沒有大問題。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接: 開源 C# .net mvc 開…

PostgreSQL安裝及簡單應用

下載地址&#xff1a;EDB: Open-Source, Enterprise Postgres Database Management 安裝 注意&#xff1a;端口號默認是5432 配置dbeaver應用&#xff0c;創建數據庫和表 -- 創建模式&#xff08;如果不存在&#xff09; CREATE SCHEMA IF NOT EXISTS bbbase;-- 創建序列&…

wedo智能車庫-----第31節(免費分享圖紙)

夸克網盤&#xff1a;https://pan.quark.cn/s/10302f7bbae0 高清圖紙源文件&#xff0c;需要的請自取

【springboot】IDEA創建SpringBoot簡單工程(有插件)

需求 使用SpringBoot開發一個web應用&#xff0c;瀏覽器發起請求/hello后&#xff0c;給瀏覽器返回字符串 hello world~ 步驟 1.創建Maven工程 2.導入spring-boot-stater-web起步依賴 3.編寫controller 4.提供啟動類 pom.xml文件了解 啟動類 新建包 創建類 package com.zw…

python正則表達式re(Regular Expression)

目錄 正則表達式&#xff1a; match()函數&#xff1a; search()函數&#xff1a; findall()函數&#xff1a; 正則表達式的參數&#xff1a; 表示字符范圍的參數&#xff1a; 表示字符出現的次數的參數&#xff1a; 表示同一類字符的參數&#xff1a; 貪婪和非貪婪模式…

事件驅動設計:Spring監聽器如何像咖啡師一樣優雅處理高并發

架構哲學&#xff1a;當咖啡店面對洶涌客流時&#xff0c;真正的優雅不是更快的動作&#xff0c;而是科學的協作機制。Spring事件驅動正是通過發布-訂閱模式&#xff0c;讓系統像頂級咖啡師般從容應對突發流量。一、從咖啡店看監聽器本質&#xff1a;3大核心組件拆解 場景還原&…

C++ const 關鍵字解析

const 是 C 中用于定義常量或指定不可變性的關鍵字&#xff0c;它在不同上下文中有不同的含義和用法。下面是對 const 的全面解析&#xff1a;1. 基本用法定義常量const int MAX_SIZE 100; const double PI 3.14159;這些值在程序運行期間不能被修改必須在定義時初始化與指針結…

[es自動化更新] Updatecli編排配置.yaml | dockerfilePath值文件.yml

鏈接&#xff1a;https://github.com/elastic/elasticsearch/tree/main/build-conventions elasticsearch自動化更新 本專欄使用updatecli實現自動化版本更新與依賴管理。 其配置通過編排文件&#xff08;updatecli-compose.yaml&#xff09;實現&#xff0c;該文件羅列了稱…

新手向:使用Python將多種圖像格式統一轉換為JPG

本文將詳細解析一個專業的Python腳本&#xff0c;它能夠將指定文件夾中的所有非JPG格式圖像批量轉換為JPG格式。這個腳本雖然代碼量不大&#xff0c;但包含了文件操作、圖像處理、異常處理等多個重要編程概念&#xff0c;非常適合初學者系統學習。環境準備在開始之前&#xff0…

深入剖析C++ RPC框架原理:有棧協程與分布式系統設計

深入剖析C RPC框架原理&#xff1a;有棧協程與分布式系統設計 &#x1f6e0;? 第一部分&#xff1a;RPC框架核心原理與技術架構 &#x1f310; 1.1 RPC在分布式系統中的核心地位 遠程過程調用&#xff08;RPC&#xff09;是現代分布式系統的基石&#xff0c;它實現了&#xf…

基于springboot+Vue的二手物品交易的設計與實現

基于springbootVue的二手物品交易的設計與實現 作者&#xff1a; Mr順 | 某大廠全棧開發工程師 | CSDN新星計劃導師 | Java領域優質創作者 技術棧&#xff1a; SpringBoot, JavaWeb, 數據庫等。精通Java、微信小程序開發。 項目亮點&#xff1a; 完整可運行&#xff1a; 提供…

騰訊云輕量服務器創建快照免費API接口教程

接口簡介 該API用于騰訊云輕量服務器系統盤快照創建&#xff0c;無需關機即可自動刪除舊快照并創建新快照。特點包括&#xff1a; 不占用騰訊云快照配額支持自動備份策略適用于定時備份任務僅支持系統盤快照&#xff08;云硬盤需調用專用接口&#xff09; ?請求地址? https…

C++中的智能指針(1):unique_ptr

一、背景普通指針是指向某塊內存區域地址的變量。如果一個指針指向的是一塊動態分配的內存區域&#xff0c;那么即使這個指針變量離開了所在的作用域&#xff0c;這塊內存區域也不會被自動銷毀。動態分配的內存不進行釋放則會導致內存泄漏。如果一個指針指向的是一塊已經被釋放…

HTTPS安全機制:從加密到證書全解析

目錄 1.HTTPS是什么 2.加密是什么 3.HTTPS的加密過程 3.1對稱加密 3.2非對稱加密 4.引入證書 4.1"中間人"攻擊 4.2 引入證書機制 4.3 理解數據簽名 4.4 非對稱加密 對稱加密 證書認證 5.常見問題 5.1 Fiddler等抓包工具&#xff0c;為啥能解析HTTPS的數據…