linux線程屬性、共享屬性 -开发者知识库

linux線程屬性、共享屬性 -开发者知识库,第1张

1.線程屬性

可以使用pthread_attr_t結構來指定線程屬性,並把這些屬性與線程聯系起來。可以使用pthread_attr_init函數來初始化pthread_attr_t對象為系統線程屬性的默認值。

下圖給定了各系統中定義的線程屬性。

linux線程屬性、共享屬性 -开发者知识库,第2张

如果對線程的終止狀態不感興趣,可以修改pthread_attr_t結構中的detachstate屬性,讓線程一開始就處於分離狀態,可以采用pthread_attr_setdetachstate(const pthread_attr_t *restrict attr,int * detachstate)更改pthread_attr_t結構的屬性。

linux線程屬性、共享屬性 -开发者知识库,第3张



可以通過pthread_attr_getstack函數和pthread_attr_setstack函數來對線程的棧屬性進行管理。

linux線程屬性、共享屬性 -开发者知识库,第4张

其中stackaddr代表棧的最低地址,stacksize代表棧的大小。

如果希望改變默認棧的大小,又不想處理線程棧的分配問題,這時用pthread_attr_setstacksize就很合適。選擇stack_size時,stack_size不能小於PTHREAD_STACK_MIN。

linux線程屬性、共享屬性 -开发者知识库,第5张


兩個線程的屬性沒有包含在pthread_attr_t結構中,它們是可取消狀態和可取消類型。

可取消狀態可以是PTHREAD_CANCEL_ENABLE,也可以是PTHREAD_CANCEL_DISABLE。線程可以通過pthread_setcancelstate修改它的可取消狀態。線程啟動時默認的可取消狀態時ENABLE的。當狀態為DISABLE時,對線程調用pthread_cancel的調用並不會殺死線程。這時取消請求對這個線程來說還處於掛起狀態,當取消狀態再次變為PTHREAD_CANCEL_ENABLE時,線程將在下一個取消點上對掛起的取消請求進行處理(在默認情況下,線程在取消請求發出后還是會繼續運行,直到線程到達某個取消點)。

系統默認的取消類型是推遲取消,即達到取消點之后才會真正取消線程。我們可以通過pthread_setcanceltype來設置取消的類型。可選的類型有PTHREAD_CANCEL_DEFERRED,PTHREAD_CANCEL_ASYNCHRONOUS。當選用PTHREAD_CANCEL_ASYNCHRONOUS時,線程可以再任一時刻取消,而不用等到取消點。


2.互斥量屬性

互斥量屬性是用pthread_mutexattr_t結構表示的。它值得注意的三個屬性是:進程共享屬性,健壯屬性以及類型屬性。

(1)進程共享屬性

在進程共享數據時都需要進行同步。當進程共享互斥量屬性設置為PTHREAD_PROCESS_SHARED時,它就可以用於這些進程的同步。

使用pthread_mutexattr_getshared函數得到共享屬性,適用pthread_mutexattr_setshared函數來設置共享屬性。

linux線程屬性、共享屬性 -开发者知识库,第6张

(2)健壯性

互斥量健壯性屬性與多個進程之間共享互斥量有關。這意味着當持有互斥量的進程終止時,要解決互斥量狀態恢復的問題。

健壯屬性取值有兩個不同的可能。默認值是PTHREAD_MUTEX_STALLED,這意味着持有互斥量的進程在終止時不需要采取額外的措施。在這種情況下,使用互斥量后的行為是未定義的,等待該互斥量解鎖的應用程序會被拖住。另一個取值是PTHREAD_MUTEX_ROBUST。當互斥量的健壯性設置為PTHREAD_MUTEX_ROBUST時,如果線程調用pthread_mutex_lock獲取鎖,且該鎖被另外一個進程持有,但進程終止時並沒有釋放鎖,此時線程會阻塞,但返回值會是EOWNERDEAD而不是0。

(3)類型屬性

POSIX.1定義了四種類型:(1)PTHREAD_MUTEX_NORMAL:一種標准互斥量類型,不做任何錯誤檢測。(2)PTHREAD_MUTEX_ERRORCHECK:對不合理的操作提供錯誤檢查。(3)PTHREAD_MUTEX_RECURSIVE:允許在一個互斥量還沒有釋放的情況下對該互斥量多次加鎖。(4)PTHREAD_MUTEX_DEFAULT :提供默認的行為,操作系統實現它時把它映射到其他互斥量中的一種。

這四種類型的行為下圖所示:

linux線程屬性、共享屬性 -开发者知识库,第7张

不占用是解鎖表示一個線程對其他線程的互斥量進行解鎖時的情況,在已解鎖時解鎖表示一個線程對已經解鎖的互斥量進行解鎖時的情況。

可以通過pthread_mutexattr_gettype函數和pthread_mutexattr_settype函數來管理互斥量的類型。


3.讀寫鎖屬性

讀寫鎖支持的唯一屬性是進程共享屬性,它與互斥量的進程共享屬性是相同的,可以通過相應的get和set函數進行操作。

linux線程屬性、共享屬性 -开发者知识库,第8张


4.屏障屬性

屏障支持的唯一屬性是進程共享屬性,它與互斥量的進程共享屬性是相同的,可以通過相應的get和set函數進行操作。

linux線程屬性、共享屬性 -开发者知识库,第9张

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复