时间:2021-05-20
当每个线程为各自的变量使用全局标识符时,为保留这些变量各自的数据,可以采用线程对象(thread-local object)和线程存储(thread-specific storage)。
这两项技术允许在一个给定线程中执行的函数可以共享数据而不造成冲突,即便当其他线程也在执行同样函数的情况下。
线程对象是在声明中包含新存储类修饰符 _Thread_local 的全局或静态对象。这意味着:每一个线程拥有属于自己的线程对象实例,它在线程启动时创建并初始化。对象的存储周期等于线程的运行时间。在一个线程内表达式里面的线程对象名,将引用这个对象在当前线程下的本地实例。
修饰符 _Thread_local 可以与修饰符 static 或 extern 同时使用。头文件 threads.h 定义了 thread_local 作为 _Thread_local 的同义词。在例 1 中,主线程和新启动线程各自拥有线程本地变量 var 的一个实例。
【例1】使用一个线程对象
线程存储技术要比线程对象更加灵活。例如,独立线程可以使用不同大小的内存。它们可以动态地分配内存,并通过调用析构函数再次释放内存。同时,可以使用相同的标识符访问这些独立线程所在的不同内存区域。
这种灵活性通过初始创建一个全局的键(key)实现,该键表示了一个指向线程存储的指针。然后,独立线程通过指定其线程存储的位置加载这个指针。该全局键值是类型为 tss_t 的对象。头文件 threads.h 包含了该类型的定义以及 4 个用于管理线程存储(简称 TSS)函数的声明:
int tss_create(tss_t*key,tss_dtor_t dtor);通过析构函数 dtor 生成一个新的 TSS 指针,并且将 key 引用的对象设置为唯一标识该 TSS 指针的值。类型 tss_dtor_t 是一个函数指针,定义为 void(*)(void*)(它指的是一个函数指针,该函数参数为 void 指针,并且该函数没有返回值)。dtor 的返回值可以是一个空指针。
void tss_delete(tss_t key);释放 TSS 键 key 所使用的所有资源。
int tss_set(tss_t key,void*val);对于调用 tss_set()的线程,将 key 所标识的 TSS 指针设置为 val 所引用的内存地址。
void*tss_get(tss_t key);返回指向内存块的指针,该内存块为正在调用的线程通过函数 tss_set()设置。如果发生错误,tss_get()返回 NULL。
如果函数 tss_create()和 tss_set()发生错误,则返回 thrd_error;否则,返回 thrd_success。
例 2 中的程序在动态分配的线程存储中,保留线程的名称。
【例2】使用线程存储
到此这篇关于C语言线程对象和线程存储的实现的文章就介绍到这了,更多相关C语言线程对象和线程存储内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
简介ThreadLocal是每个线程自己维护的一个存储对象的数据结构,线程间互不影响实现线程封闭。一般我们通过ThreadLocal对象的get/set方法存取
在.net面向对象程序设计阶段在线程资源共享中的线程安全和线程冲突的解决方案;多线程同步,使用线程锁和线程通知实现线程同步,具体内容介绍如下:1、ThreadS
python线程暂停,恢复,退出我们都知道python中可以是threading模块实现多线程,但是模块并没有提供暂停,恢复和停止线程的方法,一旦线程对象调用s
本文实例介绍了C语言实现线程池,支持动态拓展和销毁,分享给大家供大家参考,具体内容如下实现功能1.初始化指定个数的线程2.使用链表来管理任务队列3.支持拓展动态
本文实例讲述了C#中Mutex对象用法。分享给大家供大家参考,具体如下:C#语言有很多值得学习的地方,这里我们就来介绍C#Mutex对象,包括介绍控制好多个线程