APUE學習之多線程編程(三):線程屬性、同步屬性

来源:http://www.cnblogs.com/shenlinken/archive/2016/08/24/5801472.html
-Advertisement-
Play Games

一、線程屬性 可以使用pthread_attr_t結構修改線程預設屬性,並這些屬性和創建的線程練習起來,可以使用pthread_att_init函數初始化pthread_attr_t結構,調用pthread_attr_init後,pthread_attr_t結構所包含的就是操作系統實現支持的所有線程 ...


一、線程屬性      可以使用pthread_attr_t結構修改線程預設屬性,並這些屬性和創建的線程練習起來,可以使用pthread_att_init函數初始化pthread_attr_t結構,調用pthread_attr_init後,pthread_attr_t結構所包含的就是操作系統實現支持的所有線程屬性的預設值。      pthread_attr_destroy用於銷毀屬性對象,釋放資源。
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr)
int pthread_attr_destroy(pthread_attr_t *attr)

     線程屬性有四個:

     1.detachstate 線程的分離狀態屬性      2.guardsize 線程棧末尾的警戒緩衝區大小(位元組數)      3.stackaddr 線程棧的最低地址      4.stacksize 線程棧的最小長度        如果在創建線程時就知道不需要瞭解線程的終止狀態,可以修改pthread_attr_t結構中的detachstate屬性,讓線程一開始就處於分離狀態。可以使用pthread_attr_setdetachstate把線程屬性detachstate設置為以下兩個合法值之一:PTHREAD_CREATE_DETACHED,PTHREAD_CREATE_JOINABLE.
#include <pthread.h>
int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr, int *detachstate);
int pthread_attr_setdetachstate(const pthread_attr_t *attr, int *detachstate);

例子:

#include "apue.h"
#include <pthread.h>
 
int makethread(void *(*fn)(void *), void *arg)
{
    int err;
    pthread_t tid;
    pthread_attr_t attr;
 
    err = pthread_attr_init(&attr);
 
    if (err != 0)
    {
        return err;
    }
 
    err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 
    if (err == 0)
    {
        err = pthread_create(&tid, &attr, fn, arg);
    }
 
    pthread_attr_destroy(&attr);
    return err;
}
View Code      遵循POSIX標準的系統,未必支持線程棧屬性,可以在編譯階段用_POSIX_THREAD_ATTR_STACKADDR和_POSIX_THREAD_ATTR_STACKSIZE符號來檢查系統是否支持線程棧屬性。      可以使用pthread_attr_getstack和pthread_attr_setstack對線程棧屬性進行管理
#include <pthread.h>
int pthread_attr_getstack(const pthread_attr_t *restrict attr, void **restrick stackaddr, size_t *restrict stacksize)
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize)

     如果線程棧的虛地址空間用完了,那可以使用malloc或者mmap來為可替代的棧分配空間,stackaddr為棧的最低記憶體地址。

     也可以通過pthread_attr_getstacksize和pthread_attr_setstacksize讀取或設置線程屬性stacksize。
#include <pthread.h>
int pthread_attr_getstacksize(const pthread_attr_t *restrict attr, size_t *restrict stacksize)
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t *stacksize)

     線程屬性guardsize控制著線程棧末尾之後用以避免棧溢出的擴展記憶體的大小。

#include <phtread.h>
int pthread_attr_getguardsize(const pthread_attr_t *restrict attr, size_t *restrict guardsize)
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize)

     二、互斥量屬性

     對應非預設屬性,可以使用pthread_mutexattr_init初始化,pthread_mutexattr_destroy反初始化。
#include <pthread.h>
int pthread_mutexattr_init(pthread_mutexattr *attr)
int pthread_mutexattr_destroy(pthread_mutexattr *attr)

     互斥量屬性中值得註意的兩個屬性:進程共用屬性,類型屬性

     當進程共用屬性設為PTHREAD_PROCESS_SHARED時,允許多個進程訪問共用數據,當進程共用屬性為PTHREAD_PROCESS_PRIVATE,則不允許。
#include <pthread.h>
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr, int *restrict pshared)
int pthread_mutexattr_setpshared(const pthread_muteattr_t *attr, int pshared)

     類型屬性控制住互斥量的鎖定特性,值得註意的是其中的PTHREAD_MUTEX_RECURSIVE類型,此類型允許同一線程在互斥量解鎖之前對該互斥量進行多次加鎖。遞歸互斥量維護鎖的基數,在解鎖次數和加鎖次數不相同的情況下,不解鎖。

#include <pthread.h>
int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict attr, int *restrict type)
int pthread_mutexattr_settype(pthread_mutexattr *attr, int type)

     三、讀寫鎖屬性

     使用pthread_rwlockattr_init初始化pthread_rwlockattr_t結構,用pthread_rwlockattr_destroy銷毀。
#include <pthread.h>
int pthread_rwlockattr_init(pthread_rwlockattr_t *attr)
int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr)

     讀寫鎖唯一屬性是進程共用屬性,與互斥量的進程共用屬性相同。

#include <pthread.h>
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict attr, int *restrict pshared)
int pthread_rwlockattr_setpshared(const pthread_rwlockattr_t *attr, int * pshared)

     四、條件變數屬性

     有一對用於初始化和銷毀的函數。
#include <pthread.h>
int pthread_condattr_init(pthread_condattr_t *attr)
int pthread_condattr_destroy(pthread_condattr_t *attr)

     條件變數支持進程共用屬性和時鐘屬性,其中進程共用屬性與互斥量的進程共用屬性相同。

#include <pthread.h>
int pthread_condattr_getpshared(const pthread_condattr_t *restrict attr, int *restrict pshared)
int pthread_condattr_setpshared(const pthread_condattr_t *attr, int pshared)

     時鐘屬性控制pthread_cond_timedwait函數的超時參數tsptr採用的是哪個時鐘。

#include <pthread.h>
int pthread_condattr_getclock(const pthread_condattr_t *restrict attr, clockid_t *restrict clock_id)
int pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近開始看操作系統的書(本身不是這個方向的),單看書本管程還是不能完全理解,現在簡單總結一下吧。 1.管程 (英語:Monitors,也稱為監視器) 是一種程式結構,結構內的多個子程式(對象或模塊)形成的多個工作線程互斥訪問共用資源。這些共用資源一般是硬體設備或一群變數。管程實現了在一個時間點,最多 ...
  • Background 使用Keil RTX RTOS的項目開發過程中,在加入一些新的代碼之後,發現線上程們被創建並被啟動之後,程式就跑飛了。 藉助Keil的RTOS debug視窗,發現有其中2個線程有stack overflow的現象。 於是開始思考RTOS thread stack size的設 ...
  • linux的基本原則: 1、有目的單一的小程式組成,組合小程式完成複雜任務。 2、一切皆文件 3、儘量避免捕獲用戶介面 4、配置文件保存為純文本格式 CLI介面: 命令提示符,prompt,bash #:root $:普通用戶 命令格式: 命令 選項 參數 選項: [] :可省略 <>:必選 ... ...
  • 在Linux系統當中,如何搜、索查找文件裡面的內容呢? 這個應該是系統維護、管理當中遇到最常見的需求。那麼下麵介紹,總結一下如何搜索、查找文件當中的內容。 搜索、查找文件當中的內容,一般最常用的是grep命令,另外還有egrep, vi命令也能搜索文件裡面內容 1:搜索某個文件裡面是否包含字元串,使... ...
  • 1.定義 進程是具有一定獨立功能的程式關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。 線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能夠獨立運行的基本單位。線程自己不擁有系統資源,與和它同在一個進程中的其他線程共用進程所擁有的系統資源。 2.關係 ...
  • 1. 安裝一個小程式:Add_Open_Command_Window_Here.reg 2. 選中一個文件夾,按住“Shift”+右鍵,出來 3. 自動跳出命令行視窗 ...
  • 安裝軟體時遇到這樣的情況:我就是管理員許可權啊,怎麼會安裝有問題呢? 後來知道,用戶名即使分配了你是管理員許可權,有些文件還是有限制的(特別是C盤) 昨天遇到一個問題,有個文件夾里的隱藏文件就是無法顯示,做瞭如下操作: 選中文件夾右鍵“屬性”—“安全”—添加“Everyone”,把所有許可權勾上。 ...
  • 1. 點擊“組織”,再選擇“文件夾和搜索選項”命令。 2. 接下來在打開的“文件夾選項”對話框中,單擊“查看”,切換到“查看”選項卡中。 3. 然後在下麵的“高級設置”區域,取消“隱藏受保護的操作系統文件”前面的覆選框;再選擇下麵的“顯示隱藏的文件、文件夾和驅動器”單選項。 4. 最後單擊“確定”按 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...