当前位置: 技术问答>linux和unix
关于线程特定数据共享全局变量的一个程序
来源: 互联网 发布时间:2017-03-17
本文导语: 我有一个问题,线程特定数据怎么理解,我看了些小程序,差不多是不是这个意思,进程有一个key,然后每个线程给进程的这个key设定一个值(指针),各个线程的值是独立的,于是我看了下下面这个程序,表示不淡...
我有一个问题,线程特定数据怎么理解,我看了些小程序,差不多是不是这个意思,进程有一个key,然后每个线程给进程的这个key设定一个值(指针),各个线程的值是独立的,于是我看了下下面这个程序,表示不淡定了,共享全局变量的问题。
#include
#include
int my_errno = 0;
pthread_key_t key;
void *thread2(void *arg)
{
my_errno = 2;
pthread_setspecific(key, &my_errno);
printf("thread2: %u; pkey address: %p; pkey value: %d, my_errno = %d, my_errno address = %pn",
(unsigned int)pthread_self(), (int *)pthread_getspecific(key),
*((int *)pthread_getspecific(key)), my_errno, &my_errno);
}
void *thread1(void *arg)
{
my_errno = 1;
pthread_setspecific(key, &my_errno);
printf("thread2: %u; pkey address: %p; pkey value: %d, my_errno = %d, my_errno address = %pn",
(unsigned int)pthread_self(), (int *)pthread_getspecific(key),
*((int *)pthread_getspecific(key)), my_errno, &my_errno);
}
int main(void)
{
pthread_t thid1, thid2;
printf("main thread begins running, my_errno=%d, my_errno address = %pn",my_errno, &my_errno);
pthread_key_create(&key, NULL);
pthread_create(&thid1, NULL, thread1, NULL);
pthread_create(&thid2, NULL, thread2, NULL);
sleep(2);
pthread_key_delete(key);
printf("main thread exitn");
return 0;
}
程序输出:
main thread begins running, my_errno=0, my_errno address = 0x8049adc
thread2: 3067120496; pkey address: 0x8049adc; pkey value: 2, my_errno = 2, my_errno address = 0x8049adc
thread2: 3077610352; pkey address: 0x8049adc; pkey value: 1, my_errno = 1, my_errno address = 0x8049adc
main thread exit
我发现共享的全局变量的地址是一样的 0x8049b0c,但是值不一样,既然是特定数据,我的理解是每个线程为此数据单独开辟一个空间存储,相当于存储副本,但是事实好像不是这样子,麻烦高手帮忙解释一下吧。
#include
#include
int my_errno = 0;
pthread_key_t key;
void *thread2(void *arg)
{
my_errno = 2;
pthread_setspecific(key, &my_errno);
printf("thread2: %u; pkey address: %p; pkey value: %d, my_errno = %d, my_errno address = %pn",
(unsigned int)pthread_self(), (int *)pthread_getspecific(key),
*((int *)pthread_getspecific(key)), my_errno, &my_errno);
}
void *thread1(void *arg)
{
my_errno = 1;
pthread_setspecific(key, &my_errno);
printf("thread2: %u; pkey address: %p; pkey value: %d, my_errno = %d, my_errno address = %pn",
(unsigned int)pthread_self(), (int *)pthread_getspecific(key),
*((int *)pthread_getspecific(key)), my_errno, &my_errno);
}
int main(void)
{
pthread_t thid1, thid2;
printf("main thread begins running, my_errno=%d, my_errno address = %pn",my_errno, &my_errno);
pthread_key_create(&key, NULL);
pthread_create(&thid1, NULL, thread1, NULL);
pthread_create(&thid2, NULL, thread2, NULL);
sleep(2);
pthread_key_delete(key);
printf("main thread exitn");
return 0;
}
程序输出:
main thread begins running, my_errno=0, my_errno address = 0x8049adc
thread2: 3067120496; pkey address: 0x8049adc; pkey value: 2, my_errno = 2, my_errno address = 0x8049adc
thread2: 3077610352; pkey address: 0x8049adc; pkey value: 1, my_errno = 1, my_errno address = 0x8049adc
main thread exit
我发现共享的全局变量的地址是一样的 0x8049b0c,但是值不一样,既然是特定数据,我的理解是每个线程为此数据单独开辟一个空间存储,相当于存储副本,但是事实好像不是这样子,麻烦高手帮忙解释一下吧。
|
因为第一个线程执行完了退出了, 第二个线程才执行的。
楼主想多了,更多问题可在CU讨论。
楼主想多了,更多问题可在CU讨论。
|
因为第一个线程执行完了退出了, 第二个线程才执行的。
楼主想多了,更多问题可在CU讨论。
楼主想多了,更多问题可在CU讨论。