这个原作者的这个地方写错了 且他举的例子非常不好.最后有我的修正版本 pthread_setspecific(key, (void *)&my_errno); linux 线程私有数据之一键多值技术TSD池 2012-09-15 16:22:08 分类: LINUX                linux 线程私有数据之 一键多值技术 进程内的所有线程共享进程的数据空间,因此全局变量为所有线程所共有.但有时线程也需要保存自己的私有数据,这时可以创建线程私有数据(Thread- specific…
一:线程私有数据: 线程是轻量级进程,进程在fork()之后,子进程不继承父进程的锁和警告,别的基本上都会继承,而vfork()与fork()不同的地方在于vfork()之后的进程会共享父进程的地址空间,但是有了写实复制(fork()之后的子进程也不会直接复制父进程的地址空间在另一块内存,除非子进程修改了某种信息,才会在内存中为它重新复制一块区域)的出现之后,vfork()基本上就没什么作用了.但是线程与进程相比,还是有许多优点,比如节约资源,它复制的东西比vfork()之后的进程复制的东西还要…
进程内的所有线程共享进程的数据空间,所以全局变量为所有线程共有.在某些场景下,线程需要保存自己的私有数据,这时可以创建线程私有数据(Thread-specific Data)TSD来解决.在线程内部,私有数据可以被线程的各个接口访问,但对其他线程屏蔽. 线程私有数据采用了一键多值技术,及一个key对应多个值.访问数据都是通过键值来访问的. 使用线程私有数据时,需要对每个线程创建一个关联 的key,linux中主要有四个接口来实现: 1.pthread_key_create:创建一个键 int p…
在多线程程序中.常常要用全局变量来实现多个函数间的数据共享.因为数据空间是共享的,因此全局变量也为全部线程共同拥有. 測试代码例如以下: #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> int key = 100; //全局变量 void *helloworld_one(void *arg) { printf("the message i…
进程内所有的线程共享地址空间,任何声明为静态或外部的变量,或在进程堆声明的变量都可以被进程内的所有线程读写. static,extern,或堆变量的值是上次线程改写的值 一个线程真正拥有的唯一私有存储时处理器寄存器.甚至栈地址也能被共享,寄存器和“私有”堆栈都不能代替非线程代码中使用的持久静态存储 当线程需要有个私有变量时,首先决定所有线程时候共享相同的值,或线程是否该有他自己的值 如果共享变量,使用静态或外部数据,同步跨越多线程对共享数据进行存取 如果每个线程需要个私有变量,在每个线程的堆栈中…
转自:http://blog.csdn.net/kkxgx/article/details/7513278 版权声明:本文为博主原创文章,未经博主允许不得转载. 一,一次性初始化 以保证线程在调用资源时,确保资源已经被初始化,并且只初始化一次. 在传统的顺序编程中,一次性初始化经常通过使用布尔变量来管理.控制变量被静态初始化为0,而任何依赖于初始化的代码都能测试该变量.如果变量值仍然为0,则它能实行初始化,然后将变量置为1.以后检查的代码将跳过初始化. 但是在多线程程序设计中,事情就变的复杂的多…
 在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的索引来实现访问,但是有一个问题是系统生成的线程 ID不能保证是一个小而连续的整数,并且用数组实现的时候由于其他线程也可以访问其数组中的数据,这样会引起数据混乱.这时候我们可以借助线程的私有数据 来解决这个问题.       线程私有数据实现的主要思想是:在分配线程私有数据之前,创建与该数据相关联的健,这个键可以被进程中的所有线程使用,但每个线程把这个键与不同的线程私有数据地址进行关联,需要说明的是每…
线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制. 在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变量,都可以被进程内所有的线程读写. 一个线程真正拥有的唯一私有存储是处理器寄存器,栈在"主人"故意暴露给其他线程时也是共享的. 有时需要提供线程私有数据:可以跨多个函数访问(全局):仅在某个线程有效(私有)(即在线程里面是全局).例如:errno. 进程中的所有线程都可以访问进程的整个地址…
Thread-specific data(TSD)线程私有数据 http://blog.chinaunix.net/uid-26885237-id-3209913.html linux多线程编程中引入了Thread-Specific Data(线程相关的数据)的概念 为什么需要"线程相关的数据"呢?怎样使用"线程相关的数据"呢? 1. 为什么需要Thread-Specific Data "线程相关的数据" 这里只介绍我个人认为的一个原因, 当然它…
#include <stdio.h> #include <pthread.h> pthread_key_t key; pthread_once_t ponce = PTHREAD_ONCE_INIT; void ronce(){ printf("%s\n", "ronce"); } void *thread1(){ pthread_setspecific(key, "thread1"); printf("%s\n…