linux線程-函數

來源:互聯網
上載者:User
索引:

1.建立線程pthread_create
2.等待線程結束pthread_join
3.分離線程pthread_detach
4.建立線程鍵pthread_key_create
5.刪除線程鍵pthread_key_delete
6.設定線程資料pthread_setspecific
7.擷取線程資料pthread_getspecific
8.擷取線程標示符pthread_self
9.比較線程pthread_equal
10.一次執行pthread_once
11.出讓執行權sched_yield
12.修改優先順序pthread_setschedparam
13.擷取優先順序pthread_getschedparam
14.發送訊號pthread_kill
15.設定線程掩碼pthread_sigmask
16.終止線程pthread_exit
17.退出線程pthread_cancel
18.允許/禁止退出線程pthread_setcancelstate
19.設定退出類型pthread_setcanceltype
20.建立退出點pthread_testcancel
21.壓入善後處理函數
22.彈出善後處理函數


1.建立線程pthread_create

#include <pthread.h>
int pthread_create(pthread_t *tid, const pthread_attr_t *tattr, void *(*start_routine)(void *), void *arg);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

建立一個線程。

參數tattr中含有初始化線程所需要的屬性,start_routine是線程入口函數的地址,當start_routine返回時,相應的線程就結束了。

當函數成功時,線程標示符儲存在參數tid指向的記憶體中。

如果不指定屬性對象,將其置為NULL,則建立一個預設的線程,有如下屬性:

  • 非綁定的;
  • 未分離的;
  • 由一個預設大小的堆棧;
  • 具有和父線程一樣的優先順序。

注意:在建立子線程時,傳給子線程的輸入參數最好是由malloc()函數返回的指標或指向全域變數的指標,而不要是指向局部變數的指標。要保證子線程處理參數時,該地區仍然有效。

2.等待線程結束pthread_join

#include <pthread.h>
int pthread_join(pthread_t tid, void **status);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

等待一個線程結束。

該函數阻塞調用它線程,直到參數tid指定的線程結束。

tid指定的線程必須在當前進程中,同時tid指定的線程必須是非分離的。

不能有多個線程等待同一個線程終止。如果出現這種情況,一個線程將成功返回,別的線程將返回錯誤ESRCH。

如果參數status不為NULL,則將線程的退出狀態放在status指向的記憶體中。


3.分離線程pthread_detach

#include <pthread.h>
int pthread_detach(pthread_t tid);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

將非分離的線程設定為分離線程。即通知線程庫在指定的線程終止時回收線程佔用的記憶體等資源。

在一個線程上使用多次pthread_detach的結果是不可預見的。


4.建立線程鍵pthread_key_create

#include <pthread.h>
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

在進程中分配一個索引值,這個鍵被用來表示一個線程資料項目。這個鍵對進程中所有的線程都是可見的。剛建立線程資料鍵時,在所有線程中和這個鍵相關聯的值都是NULL。

函數成功返回後,分配的鍵放在key參數指向的記憶體中,必須保證key參數指向的記憶體區的有效性。

如果指定瞭解析函數destructor,那麼當線程結束時並且將非空的值綁定在這個鍵上,系統將調用destructor函數,參數就是相關線程與這個鍵綁定的值。綁定在這個鍵上的記憶體塊可由destructor函數釋放。


5.刪除線程鍵pthread_key_delete

#include <pthread.h>
int pthread_key_delete(pthread_key_t key);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

刪除線程資料鍵。這個鍵佔用的記憶體將被釋放,該鍵再被引用將返回錯誤。

在調用該函數之前,程式必須釋放和本線程相關聯的資源,該函數不會引發線程資料鍵的解析函數。


6.設定線程資料pthread_setspecific

#include <pthread.h>
int pthread_setspecific(pthread_key_t key, const void *value);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定和某個線程資料鍵綁定在一起的線程專用資料(一般是指標)。

函數不會釋放原來綁定在鍵上的記憶體,給一個索引值綁定新的指標時,必須釋放原指標指向的記憶體,否則會發生記憶體流失。


7.擷取線程資料pthread_getspecific

#include <pthread.h>
void pthread_getspecific(pthread_key_t key, void **value);
無傳回值。出錯時value指向NULL。

擷取綁定線上程資料鍵上的值,並在指定的位置儲存取來的值。


8.擷取線程標示符pthread_self

#include <pthread.h>
pthread_t pthread_self(void);

返回當前線程的標示符。


9.比較線程pthread_equal

#include <pthread.h>
int pthread_equal(pthread_t tid1, pthread_t tid2);
如果tid1和tid2相同,函數返回一個非0值,否則返回0。

如果tid1或tid2中任何一個是非法值,則返回將是不可預料的。


10.一次執行pthread_once

#include <pthread.h>
int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

函數用來調用初始化函數。如果已經有線程通過pthread_once調用過這個初始化函數一次,那麼以後通過pthread_once函數再調用這個初始化函數將無效。

參數once_control決定了相應的初始化函數是否被調用過。它一般如下使用:
[static] pthread_once_t once_control = PTHREAD_ONCE_INIT。


11.出讓執行權sched_yield

#include
int sched_yield(void);
傳回值:函數成功返回0。-1表示錯誤。

把當前線程的執行權(即對處理器的控制權)出讓給另一個有相同或更高優先順序的線程。


12.修改優先順序pthread_setschedparam

#include <pthread.h>
int pthread_setschedparam(pthread_t tid, int policy, const struct sched_param *param);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

修改線程的優先權。


13.擷取優先順序pthread_getschedparam

#include <pthread.h>
int pthread_getschedparam(pthread_t tid, int policy, struct schedparam *param);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

擷取線程的優先順序。


14.發送訊號pthread_kill

#include <pthread.h>
int pthread_kill(pthread_t tid, int sig);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

向tid指定的線程發送一個訊號,tid指定的線程必須和當前線程在同一個進程中。

當sig參數為0時,函數將進行錯誤檢查,不發送訊號,這常常用來檢查tid的合法性。


15.設定線程掩碼pthread_sigmask

#include <pthread.h>
#include <signal.h>
int pthread_sigmask(int how, const sigset_t *new, sigset_t *old);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

改變或檢驗當前線程的訊號掩碼。

參數how表示對當前訊號掩碼進行什麼操作,有如下值:SIG_BLOCK、SIG_UNBLOCK、SIG_SETMASK。

當參數new為NULL時,不論how的值是什麼,當前線程的訊號掩碼都不會改變。

舊的訊號掩碼儲存在參數old指向的記憶體中,當old不為NULL時。


16.終止線程pthread_exit

#include <pthread.h>
void pthread_exit(void *status);

終止當前線程,所有綁定線上程資料鍵上的記憶體將被釋放。如果當前線程是非分離的,那麼這個線程的標示符合結束代碼將被保留,直到其他線程用pthread_join來等待當前線程的終止。如果當前線程是分離的,status將被忽略,線程標示符將被立即回收。

若status不為NULL,線程的結束代碼被置為status參數指向的值。


17.退出線程pthread_cancel

#include <pthread.h>
int pthread_cancel(pthread_t thread);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

退出一個線程。如何響應退出請求取決於目標線程的狀態。


18.允許/禁止退出線程pthread_setcancelstate

#include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

參數state取值為PTHREAD_CANCEL_ENABLE或PTHREAD_CANCEL_DISABLE。


19.設定退出類型pthread_setcanceltype

#include <pthread.h>
int pthread_setcanceltype(int type, int *oldtype);
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

將線程退出類型設定為延遲類型或非同步類型。參數type的取值為PTHREAD_CANCEL_DEFERRED或PTHREAD_CANCEL_ASYNCHRONOUS。

當一個線程被建立後,預設值是延遲類型。在非同步方式下,線程可以在執行的任何時候被退出。


20.建立退出點pthread_testcancel

#include <pthread.h>
void pthread_testcancel(void);
無傳回值。

設定線程的退出點。

只有當線程的退出狀態是允許退出的,而且線程的退出類型是延遲時,調用該函數才有效。如果調用時線程的退出狀態是禁止的,則該調用不起作用。

小心使用該函數,只有在能夠安全的被退出的地方才能夠設定退出點。


21.壓入善後處理函數

#include <pthread.h>
void pthread_cleanup_push(void (*routine)(void *), void *args);

將一個善後處理函數壓入善後處理函數堆棧。


22.彈出善後處理函數

#include <pthread.h>
void pthread_cleanup_pop(int execute);

從善後處理函數堆棧中彈出一個善後處理函數。如果參數execute非0,則執行彈出的函數;如果參數為0,則不執行彈出函數。

如果一個線程顯式或隱式的調用pthread_exit()函數或線程接受了退出請求,線程庫實際上將會以非0參數調用pthread_cleanup_pop函數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.