A、 一般情况
动态库在被系统加载后,代码段只有一份,所有使用者共享。对于数据段要分两种情况:
- 如果是多进程的话,数据段在每个进程中拥有一个独立的副本,所以数据是安全的。
- 如果是多线程的话,数据段在同一个进程中是同一个地址空间,所以数据是不安全的。
B、共享数据段
共享数据段可以解决多个进程希望通过一个动态库里的某个全局变量来实现进程间通信的问题。
C、线程私有存储(Thread Local Storage)
多个线程访问不同的全局变量副本,比如C语言运行库的errno全局变量。
线程私有 | 线程之间共享(进程所有) |
---|---|
*局部变量 | *全局变量 |
*函数的参数 | *堆上的数据 |
*TLS数据 | *函数里的静态变量 |
*程序代码,任何线程都有权利读取并执行代码 | |
*打开的文件,A线程打开的文件可以由B线程读写 |
- 静态TLS
__declspec(thread) - 动态TLS
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)); void *pthread_getspecific(pthread_key_t key); int pthread_setspecific(pthread_key_t key, const void *value); int pthread_key_delete(pthread_key_t key);