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

來源:互聯網
上載者:User

APUE學習之多線程編程(三):線程屬性、同步屬性,apue多線程編程
一、線程屬性     可以使用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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.