亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

怎么基于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

乐东| 铜川市| 三江| 台前县| 桐柏县| 汝南县| 高青县| 清流县| 阿克陶县| 中西区| 丽江市| 垦利县| 精河县| 禄丰县| 庐江县| 青海省| 桐庐县| 阿克| 枣庄市| 洛隆县| 固阳县| 韩城市| 五原县| 南乐县| 合山市| 乌什县| 四子王旗| 韶山市| 阳山县| 邵阳县| 措美县| 来宾市| 蓬溪县| 威海市| 南陵县| 丰镇市| 南江县| 博爱县| 页游| 刚察县| 五河县|