线程特定数据:概念、使用与管理
1. 线程特定数据概述
在单线程程序中,如果一个函数需要创建跨调用持久存在的私有数据,可以在内存中静态分配这些数据。其名称的作用域可以限制在使用它的函数或文件中(使用static关键字),也可以设为全局(使用extern关键字)。
然而,在多线程环境下情况变得复杂。一个进程内的所有线程共享相同的地址空间,这意味着任何声明为static或extern的变量,或者在进程堆中的变量,都可能被该进程内的所有线程读写。这对于想要在线程内一系列函数调用之间存储“持久”数据的代码有重要影响:
-数据共享问题:static或extern变量以及堆中的值,将是任何线程最后写入的值。这在某些情况下可能是期望的,比如维护伪随机数序列的种子;但在其他情况下可能并非如此。
-真正的私有存储:线程真正“私有”的存储是处理器寄存器。即使栈地址也可以共享,前提是“所有者”故意将地址暴露给其他线程。但无论寄存器还是“私有”栈,都无法替代非线程化代码中持久静态存储的用途。
因此,当需要一个私有变量时,首先要决定所有线程是否共享相同的值,还是每个线程应该有自己的值。
-共享数据情况:如果线程共享数据,可以像单线程程序一样使用static或extern数据,但必须同步