为线程特定数据创建键

#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <sched.h>
#include<string.h>
pthread_key_t key;
void destructor(void *data)
//如果创建该键时指定了destructor 函数,则该线程终止时,系统会调用destructor 函数,传进的参数是绑定的值。
 {
       if(data != NULL)
          free(data);
        printf("thread (%u) do free key\n", (unsigned)pthread_self());
}
 void print_key(void)
 {
        char *p;
        p = (char *)pthread_getspecific(key);
        printf("(%u) key_value:%s\n", (unsigned)pthread_self(), p);
 }
  void *thread1(void *arg)
 {
         printf("start thread (%u)\n", (unsigned)pthread_self());
         char * p = malloc(7*sizeof(char));
         memset(p, ‘a‘, 6);
         p[6] = ‘\0‘;
         pthread_setspecific(key, p);//key绑定的值为p
         printf("(%lu)setkey:%s\n", pthread_self(), p);
         print_key();
         printf("thread (%u) end\n", pthread_self());
 }
 void *thread2(void *arg)
 {
         printf("start thread (%u)\n", (unsigned)pthread_self());
         char * p = malloc(7*sizeof(char));
         memset(p, ‘c‘, 6);
         p[6] = ‘\0‘;
         pthread_setspecific(key, p);//key绑定的值为p
         printf("(%lu)setkey:%s\n", pthread_self(), p);
         print_key();
         printf("thread (%u) end\n", pthread_self());
 }
 int main(int argc, char *argv[])
 {
         pthread_t  t1, t2, t3;

         pthread_key_create(&key, destructor);

        pthread_create(&t1, NULL, thread1, NULL);
        pthread_create(&t2, NULL, thread2, NULL);

        pthread_join(t1, NULL);
        pthread_join(t2, NULL);
        printf("main end\n");
      return 0;
 }
//执行结果如下

1.在每个线程结束后系统会执行注册的撤销函数。
2.如果使用pthread_exit()提前终止线程,也会调用撤销函数。
时间: 2024-10-12 15:52:05

为线程特定数据创建键的相关文章

Linux多线程实践(4) --线程特定数据

线程特定数据 int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); int pthread_key_delete(pthread_key_t key); int pthread_setspecific(pthread_key_t key, const void *pointer); void * pthread_getspecific(pthread_key_t key); pthread_onc

线程特定数据TSD总结

一线程的本质 二线程模型的引入 三线程特定数据 四关键函数说明 五刨根问底啥原理 六私有数据使用示例 七参考文档 一.线程的本质 Linux线程又称轻量进程(LWP),也就说线程本质是用进程之间共享用户空间模拟实现的. 二.线程模型的引入 线程模型引入是为了数据共享,为什么又引入线程私有数据?有时候想让基于进程的接口适应多线程环境,这时候就需要为每个线程维护一份私有数据了,最典型的就是errno了. 在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的

pthread线程特定数据

线程特定数据,也被称为线程私有数据,是一种存储和查找一个特定线程相关数据的机制.我们称这个数据为线程特定或线程私有的原因,是因为每个线程访问它自己独立的数据拷贝,而不用担心和其它线程的访问的同步. 线程特定数据看似很复杂,其实我们可以把它理解为就是一个索引和指针.key结构中存储的是索引,pthread结构中存储的是指针,指向线程中的私有数据,通常是malloc函数返回的指针. POSIX要求实现POSIX的系统为每个进程维护一个称之为Key的结构数组(如图1所示),这个数组中的每个结构称之为一

线程特定数据

1 #include <pthread.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 7 pthread_key_t thread_self_data_key; 8 9 void destory(void *p) 10 { 11 free(p); 12 } 13 14 void createit(void) 15 { 16 pthread_key_create(

Linux多线程实践(四 )线程的特定数据

在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据, 然而在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有.但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问.POSIX线程库通过维护一定的数据结构来解决这个问题,这个些数据称为(Thread-specific-data或 TSD). 相关函数如下: int pthread_key_create(pthread_key_t *key, void (*destr

PHP:数组——二维转一维,二维转三维,将特定的数据作为键名

今天针对数组做一个总结,一句话:当我们面临多个数据时,要灵活运用数组+foreach去获取我们想要的结果 例子: 1.二维转一维数组 代码部分: 结果: 2.二维转三维 (1)代码部分:(显示方式1:将输出放在foreach循环里面) 结果: (1)代码部分:(显示方式2:将输出放在foreach循环外面) 结果: 什么时候在循环里面输出结果,什么时候在循环外面输出结果: (1)放在foreach里面打印,通常是只看一次就够了,打印後就 exit() (2)放在foreach外面打印,通常是看全

【C/C++多线程编程之十】pthread线程私有数据

多线程编程之线程私有数据 Pthread是 POSIX threads 的简称,是POSIX的线程标准.  线程同步从互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程之七]pthread信号量,条件变量[C/C++多线程编程之八]pthread条件变量,读写锁[C/C++多线程编程之九]pthread读写锁,多线程的同步机制已经有了清晰深入的探究,多线程编程的精髓所在,需要深入理解.        线程私有数据TSD(Thread-specific Data)

数据库主键的设计和思考

转载至:http://blog.csdn.net/likika2012/article/details/9949949 1. 何谓数据库主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值.由于 PRIMARY KEY约束确保唯一数据,所以经常用来定义标识

数据库主键

在我们的数据库设计中,不可逃避的就是数据库表的主键,可能有很多朋友没有深入思考过,主键的设计对整个数据库的设计影响很大,因此我们不得不要重视起来. 主键的必要性 : 在有些数据库中,虽然主键不是必需的,但最好为每个表都设置一个主键,不管是单主键还是复合主键.它存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除. 主键的无意义性 : 在开发过程中,读者可能会看到将一些表使用有意义的字段表示主键,例如"用户登录信息表"将&quo