我正在学习 POSIX 线程,我已经来到线程特定数据部分。这本书使用文件描述符做了一个很好的例子。但是,我想自己做同样的例子,除了这次使用全局变量。但是,我很难完全掌握这个概念。
我想要做的是以下内容:
- 创建一个全局整数
- 为全局 int 声明一个键
主要:
- 将全局整数设置为一个值,例如。10
- 无需任何清理即可为其创建密钥
- 创建4个线程并发送它们执行thread_func
- 检查值是否仍然是 10,因为线程只看到它的副本
在线程函数中:
- 使用 pthread_setspecific(key,global variable) 创建本地实例 - 不确定我是否正确解释
- 调用一个函数 - dosomething()
- 出口
在做某事
- 创建一个本地指针并将其分配给 pthread_getspecific(key) - 这应该让我获得全局变量的线程特定版本
- 将存储在本地指针处的值更改为 2
- 出口
这是代码:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUMTHREADS 4
pthread_key_t glob_var_key;
int glob_var;
void do_something()
{
//get thread specific data
int* glob_spec_var = (int*) pthread_getspecific(glob_var_key);
printf("Thread %d glob_spec before mod value is %d\n", (unsigned int) pthread_self(), *glob_spec_var);
*glob_spec_var = 2;
printf("Thread %d glob_spec after mod value is %d\n", (unsigned int) pthread_self(), *glob_spec_var);
}
void* thread_func(void *arg)
{
pthread_setspecific(glob_var_key, &glob_var);
do_something();
pthread_exit(NULL);
}
int main(void)
{
pthread_t threads[NUMTHREADS];
int i;
glob_var = 10;
pthread_key_create(&glob_var_key,NULL);
printf("Main: glob_var is %d\n", glob_var);
for (i=0; i < NUMTHREADS; i++)
{
pthread_create(&threads[i],NULL,thread_func,NULL);
}
for (i=0; i < NUMTHREADS; i++)
{
pthread_join(threads[i], NULL);
}
printf("Main: glob_var is %d\n", glob_var);
return 0;
}
据我了解,当您调用 pthread_getspecific 时,每个线程都应该有自己唯一的内存地址作为内存地址——我在这里没有发现这种情况。我知道我没有正确处理这个问题,当我在执行 getspecific 时尝试查看每个线程的内存地址时,我看到了相同的内存地址。也许有人可以给我举个例子,他们使用全局变量(而不是文件描述符)并且他们具有线程特定的用法,其中线程将其视为局部变量。