線程可以經(jīng)過更多高級內(nèi)容的設置,可以控制的屬性很多;
前面的例子中,我們在程序退出之前用了pthread_join 對線程再次同步,如果我們想讓線程向創(chuàng)建它的線程返回數(shù)據(jù)就需要這個函數(shù)。
但是有的時候,有可能我們不需要這些函數(shù)返回給主線程信息,也不想讓主線程等待它的結(jié)束。(ios經(jīng)常會出現(xiàn)了幾秒中之后執(zhí)行某個程序,應該就是沒有返回給主線程任何消息)
現(xiàn)實假設: 假設我們給主線程繼續(xù)為用戶提供服務的同時創(chuàng)建第二個線程,新線程的作用是用戶在編輯數(shù)據(jù)的文件-進行備份存儲。備份工作結(jié)束后,第二個線程就可以直接終止了,沒有必要再回到主線程中。
=====> 我們可以創(chuàng)建這一類型的線程,它們被稱為脫離線程(detached thread)。
可以通過(1)修改線程屬性或(2)調(diào)用pthread_detach 的方法來創(chuàng)建它們。
頭文件: pthread.h
int pthread_attr_init(pthread_attr_t *attr); 初始化, 成功返回0,
int pthread_attr_destroy(pthread_attr_t *); 目的是對屬性對象進行清理和回收。一旦對象被回收,除非重新初始化,否則不能夠再次被調(diào)用了。
初始化一個線程屬性對象后,我們可以調(diào)用線程屬性的很多對象來設置屬性行為。
int pthread_attr_destroy(pthread_attr_t *);
int pthread_attr_getdetachstate(const pthread_attr_t *, int *);
int pthread_attr_getguardsize(const pthread_attr_t * __restrict, size_t * __restrict);
int pthread_attr_getinheritsched(const pthread_attr_t * __restrict, int * __restrict);
int pthread_attr_getschedparam(const pthread_attr_t * __restrict,
struct sched_param * __restrict);
int pthread_attr_getschedpolicy(const pthread_attr_t * __restrict, int * __restrict);
int pthread_attr_getscope(const pthread_attr_t * __restrict, int * __restrict);
int pthread_attr_getstack(const pthread_attr_t * __restrict,
void * _Nullable * _Nonnull __restrict, size_t * __restrict);
int pthread_attr_getstackaddr(const pthread_attr_t * __restrict,
void * _Nullable * _Nonnull __restrict);
int pthread_attr_getstacksize(const pthread_attr_t * __restrict, size_t * __restrict);
int pthread_attr_init(pthread_attr_t *);
int pthread_attr_setdetachstate(pthread_attr_t *, int);
int pthread_attr_setguardsize(pthread_attr_t *, size_t);
int pthread_attr_setinheritsched(pthread_attr_t *, int);
int pthread_attr_setschedparam(pthread_attr_t * __restrict,
const struct sched_param * __restrict);
int pthread_attr_setschedpolicy(pthread_attr_t *, int);
int pthread_attr_setscope(pthread_attr_t *, int);
int pthread_attr_setstack(pthread_attr_t *, void *, size_t);
int pthread_attr_setstackaddr(pthread_attr_t *, void *);
int pthread_attr_setstacksize(pthread_attr_t *, size_t);
可以看到可以設置屬性的屬性很多的。?? ,下面是一個常用的設置:
(1)detachedstate : 這個屬性允許我們無需對線程進行重新合并。與大多數(shù)set類函數(shù)一樣。它以一個屬性指針和一個標志位參數(shù)來確定需要的狀態(tài)。pthread_attr_setdetachstate 函數(shù)可能用到的兩個標志分別是PTHREAD_CREATE_JOINABLE 和 PTHREAD_CREATE_DETACHED. 這個屬性的默認標志值是PTHREAD_CREATE,而JOINABLE ,所以,可以允許兩個線程重新合并。如果表示設置為PTHREAD_CREATE_DETACHED,就不能調(diào)用pthread_join 來獲得另外一個線程的退出狀態(tài)。
(2)schedpolicy : 這個屬性控制線程的調(diào)度方式。取值可以是:SCHED_OTHE、SCHED_RP 和SCHED_FIFO。 這個屬性的默認值為SHCED_OTHER .另外兩中調(diào)度方式只能用于超級用于權(quán)限運行的進程,因為它們都具備實時調(diào)度的功能,但在行為上略有區(qū)別。SCHED_RP 使用循環(huán)(round-robin) 調(diào)度機制。而schedpolicy 使用"先進先出策略"。
(3)schedparam : 這個屬性是和schedpolicy 屬性結(jié)合使用的,它可以對以SCHED_OTHER 策略運行的線程的調(diào)度進行控制。
(4)inheritsched : 這個屬性可以取兩個值:PTHREAD_EXPLICIT_SCHED 和PTHREAD_INHERIT_SCHED .它的默認取值是PTHEAD_EXPLICTT_SCHED. 表示調(diào)度由屬性明確地設置。如果把它設置為PTHREAD_INHERIT_SCHED ,新線程將沿用其創(chuàng)建者所使用的參數(shù)。
(5)scope: 這屬性控制一個線程調(diào)度的計算方式。由于目前Linux只是支持PTHREAD_SCOPE_SYSTEM ,。
(6)stacksize : 這個屬性控制線程創(chuàng)建的棧大小,單位為字節(jié)。它屬于POSIX 規(guī)范中的“可選”部分,只有在定義了宏_POSIX_THREAD_ATTR_STTACKSIZE 實現(xiàn)版本才會支持。linux實現(xiàn)線程時,默認使用的棧很大。所以這個功能對linux倆說顯得有點多余。