執行緒特定函式有以下三個
int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *));
void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);
但是經常會和下面這個函式一起使用
int pthread_once(pthread_once_t *once_control,void (*init_routine)(void))
首先解析一下執行緒特定函式原理:
key結構體的作用:每次執行緒呼叫pthread_key_create函式以後,就會去該表中尋找乙個標誌位顯示未占用的元素,填充標誌位和析構函式,然後將元素索引作為鍵值返回出來。
每個執行緒會維護乙個自己單獨的執行緒資訊表,其中有一塊稱之為pkey的陣列,這個陣列每個元素和key陣列中每個元素的下標是一一對應的。pkey陣列中的元素只是乙個指標,這個指標指向的就是每個執行緒自己特定資料的存放位址。並且元素中如果有指標,通常是動態分配的,所以後面要釋放,這就是在key結構體的析構函式指標中釋放。
對應到api介面,就是
pthread_setspecific函式用來在pkey陣列的指定下標元素中設定位址,也就是存放指向特定資料的指標。
pthread_getspecific函式用來得到pkey陣列中指定元素內的值(也就是指標值)。
而pthread_once函式是保證在多個執行緒中只會被使用一次,也就是如果執行緒a使用這個函式了,那麼其他執行緒在執行時就會跳過這個函式。
使用方法:
在分析完原理之後,我們可以發現key結構體中每乙個元素,其實對應執行緒中都有不同的pkey陣列,所以只需要呼叫pthread_key_create函式一次,每個執行緒中就都可以使用乙個自己執行緒的特定元素,所以會使用到pthread_once函式。
而且乙個程序中最多key結構體只能有128個元素,也就意味著每個執行緒所允許的特定資料的數量不能超過128個,這是規定好的。
就拿udp中的程式為例
相當於只使用了一次 pthread_key_create函式,也就是建立了乙個特定資料。
並且析構函式指標readline_destructor中釋放的就是pkey中的元素指標。
vue 生命週期函式個人理解。
1 beforecreate vue例項建立之前的準備工作 第乙個執行的函式。2.created vue例項建立之後,此時可以給data進行資料賦值,但是vue還沒有掛載到頁面上。3.beforemount vue例項掛載頁面之前,程式會判斷是否有el 通常建立vue例項的時候會指定 選項,若有則繼...
Mysql 函式 個人收藏
1.計算時間差 timestampdiff interval,datetime expr1,datetime expr2 interval 結果型別 datetime expr1 時間1 datetime expr2 時間2 2.if判斷 if 條件,成立結果,不成立結果 例 select if 1...
js建構函式個人複習
建立物件的方式 通常我們用建構函式來描述一類物件或者具有公共屬性 方法的物件 建構函式建立方法 function 型別名 首字母大寫 var obj new 型別名 屬性值,屬性值 建構函式特點 例項的建構函式屬性 constructor 指向建構函式 當使用new來建立物件時,對應的函式就是建構函...