1.specific.c简介
specific.c是LinuxThreads2.0.1线程库中的一个源文件,它实现了线程特定数据(TSD)的功能,也就是每个线程都可以有自己的数据,这些数据在线程之间是隔离的,每个线程可以访问自己的数据而不会影响其他线程。
2.specific.c实现的功能
specific.c实现了两个功能:
- 1.创建和删除线程特定数据:线程可以使用pthread_key_create()函数创建一个线程特定数据,然后使用pthread_key_delete()函数删除它。
- 2.访问和设置线程特定数据:线程可以使用pthread_setspecific()函数设置线程特定数据,使用pthread_getspecific()函数访问线程特定数据。
3.specific.c的实现原理
specific.c实现线程特定数据的原理是:每个线程都有一个独立的数据结构,该数据结构由一个指针数组和一个指针组成,指针数组的每一个元素都指向一个指针,指针指向的是用户定义的线程特定数据,这样就实现了每个线程都有自己的数据,而不会影响其他线程。
4.specific.c的实现代码
int pthread_key_create (pthread_key_t *key, void (*destr_function) (void *))
{
int i;
pthread_key_t k;
struct pthread_key_struct *new_keys;
/* Allocate a new key structure. */
if ((k = (pthread_key_t) malloc (sizeof (struct pthread_key_struct))) == NULL)
return ENOMEM;
/* Fill the structure. */
k->allocated = 0;
k->destr = destr_function;
/* Lock the global key structure. */
pthread_mutex_lock (&__pthread_key_lock);
/* Do we have to allocate a new key array? */
if (__pthread_keys == NULL) {
/* Allocate a new array. */
if ((__pthread_keys = (struct pthread_key_struct *) malloc (PTHREAD_KEYS_MAX * sizeof (struct pthread_key_struct))) == NULL) {
pthread_mutex_unlock (&__pthread_key_lock);
return ENOMEM;
}
__pthread_key_max = PTHREAD_KEYS_MAX;
__pthread_key_sch = 0;
}
/* Find a free slot in the key structure. */
for (i = __pthread_key_sch; i < __pthread_key_max; i++)
if (__pthread_keys[i].allocated == 0)
break;
/* Do we have to increase the size of the key array? */
if (i == __pthread_key_max) {
/* Allocate a new array. */
if ((new_keys = (struct pthread_key_struct *) realloc (__pthread_keys, (__pthread_key_max + PTHREAD_KEYS_MAX) * sizeof (struct pthread_key_struct))) == NULL) {
pthread_mutex_unlock (&__pthread_key_lock);
return ENOMEM;
}
__pthread_keys = new_keys;
__pthread_key_max += PTHREAD_KEYS_MAX;
}
/* Fill the slot. */
__pthread_keys[i] = *k;
__pthread_keys[i].allocated = 1;
*key = i;
/* Unlock the global key structure. */
pthread_mutex_unlock (&__pthread_key_lock);
return 0;
}