91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么基于linuxthreads2.0.1線程源碼分析specific.c

發布時間:2021-12-09 09:39:31 來源:億速云 閱讀:145 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關怎么基于linuxthreads2.0.1線程源碼分析specific.c,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

該文件是線程私有數據的實現。在線程tcb里有一個數組,保存了一系列的鍵對值。從而實現了線程的私有數據存儲。線程想擁有自己的數據時,首先獲取一個鍵,然后在tcb中保存一個鍵對值即可。

   
     
 
    
    

/

/* Thread-specific data */

#include <errno.h>
#include <stddef.h>
#include "pthread.h"
#include "internals.h"

typedef void (*destr_function)(void *);

/* Table of keys. */

struct pthread_key_struct {
 int in_use;                   /* already allocated? */
 destr_function destr;         /* destruction routine */
};

static struct pthread_key_struct pthread_keys[PTHREAD_KEYS_MAX] =
 { { 0, NULL } };

/* Mutex to protect access to pthread_keys */

static pthread_mutex_t pthread_keys_mutex = PTHREAD_MUTEX_INITIALIZER;

/* Create a new key */
// 創建一個key
int __pthread_key_create(pthread_key_t * key, destr_function destr)
{
 int i;
 // 加鎖
 pthread_mutex_lock(&pthread_keys_mutex);
 // 從列表中找一項空閑的
 for (i = 0; i < PTHREAD_KEYS_MAX; i++) {
   if (! pthread_keys[i].in_use) {
     pthread_keys[i].in_use = 1;
     pthread_keys[i].destr = destr;
     // 找到則解鎖并返回鍵值
     pthread_mutex_unlock(&pthread_keys_mutex);
     *key = i;
     return 0;
   }
 }
 // 找不到則解鎖
 pthread_mutex_unlock(&pthread_keys_mutex);
 return EAGAIN;
}
weak_alias (__pthread_key_create, pthread_key_create)

/* Delete a key */
// 刪除一個鍵對應的項
int pthread_key_delete(pthread_key_t key)
{
 pthread_mutex_lock(&pthread_keys_mutex);
 if (key >= PTHREAD_KEYS_MAX || !pthread_keys[key].in_use) {
   pthread_mutex_unlock(&pthread_keys_mutex);
   return EINVAL;
 }
 pthread_keys[key].in_use = 0;
 pthread_keys[key].destr = NULL;
 pthread_mutex_unlock(&pthread_keys_mutex);
 return 0;
}

/* Set the value of a key */
// 關聯鍵對應的值
int __pthread_setspecific(pthread_key_t key, const void * pointer)
{
 pthread_t self = thread_self();
 if (key >= PTHREAD_KEYS_MAX) return EINVAL;
 self->p_specific[key] = (void *) pointer;
 return 0;
}
weak_alias (__pthread_setspecific, pthread_setspecific)

/* Get the value of a key */

void * __pthread_getspecific(pthread_key_t key)
{
 pthread_t self = thread_self();
 if (key >= PTHREAD_KEYS_MAX)
   return NULL;
 else
   return self->p_specific[key];
}
weak_alias (__pthread_getspecific, pthread_getspecific)

/* Call the destruction routines on all keys */
// 逐個調用pthread_keys數組中的destr函數,并以線程關聯的value為參數
void __pthread_destroy_specifics()
{
 int i;
 pthread_t self = thread_self();
 destr_function destr;
 void * data;

 for (i = 0; i < PTHREAD_KEYS_MAX; i++) {
   // 銷毀時執行的函數
   destr = pthread_keys[i].destr;
   // 獲取鍵對應的值
   data = self->p_specific[i];
   // 執行
   if (destr != NULL && data != NULL) destr(data);
 }
}    

關于怎么基于linuxthreads2.0.1線程源碼分析specific.c就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白玉县| 洛川县| 敦煌市| 大足县| 永吉县| 准格尔旗| 莲花县| 庆元县| 唐山市| 辽阳市| 西和县| 仁怀市| 明溪县| 银川市| 盘山县| 泸州市| 曲周县| 彭泽县| 东兴市| 乌恰县| 仪征市| 祁东县| 五家渠市| 泉州市| 樟树市| 清远市| 张家界市| 丰原市| 大荔县| 宁陕县| 化州市| 宜章县| 嘉祥县| 翁牛特旗| 海城市| 长治市| 梁平县| 衡阳市| 建始县| 乌拉特后旗| 东乡县|