最近在工做中遇到了線程的私有存儲的東東,現將對pthread_key_t的認識與你們分享一下: linux
熟悉linux線程開發的人都清楚,一個進程中線程直接除了線程本身的棧和寄存器以外,其餘幾乎都是共享的,若是線程想維護一個只屬於線程本身的全局變量怎麼辦?線程的私有存儲解決了這個問題。 函數
下面說一下線程存儲的具體用法。
spa
- 建立一個類型爲 pthread_key_t 類型的變量。
- 調用 pthread_key_create() 來建立該變量。該函數有兩個參數,第一個參數就是上面聲明的 pthread_key_t 變量,第二個參數是一個清理函數,用來在線程釋放該線程存儲的時候被調用。該函數指針能夠設成 NULL ,這樣系統將調用默認的清理函數。
- 當線程中須要存儲特殊值的時候,能夠調用 pthread_setspecific() 。該函數有兩個參數,第一個爲前面聲明的 pthread_key_t 變量,第二個爲 void* 變量,這樣你能夠存儲任何類型的值。
- 若是須要取出所存儲的值,調用 pthread_getspecific() 。該函數的參數爲前面提到的 pthread_key_t 變量,該函數返回 void * 類型的值。
pthread_key_t不管是哪個線程建立,其餘全部的線程都是可見的,即一個進程中只需phread_key_create()一次。看似是全局變量,然而全局的只是key值,對於不一樣的線程對應的value值是不一樣的(經過pthread_setspcific()和pthread_getspecific()設置)。 線程