免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2542 | 回复: 16
打印 上一主题 下一主题

Multi-thread key query!!!! [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-25 15:07 |只看该作者 |倒序浏览
关于pthread_key,有一些问题,下面用例子来说明:

pthread_key_t p_key;

char test_key_val[30];

main
{
  pthread_key_create(&p_key,NULL);
  
  pthread_create(&p_thread_id[1],NULL,a,NULL);
  pthread_create(&p_thread_id[2],NULL,b,NULL);
  
  pthread_join(p_threada_id[1]);
  pthread_join(p_threada_id[2]);
}

a()
{
  strcpy(test_key_val,"I am a");
  pthread_setspecific(p_key,test_key_val);

  printf("Test_key_val is [%s] in a function\n",test_key_val);
}

b()
{
  strcpy(test_key_val,"I am b");
  pthread_setspecific(p_key,test_key_val);

  printf("Test_key_val is [%s] in b function\n",test_key_val);
}

结果:
Test_key_val is I am b in b function.
Test_key_val is I am b in a function.
或者是
Test_key_val is I am a in b function.
Test_key_val is I am a in a function.

运行后,为什么两次打印出的test_key_val值是相同的,或者都是I am b 或者都是I am a????按理说,应该是不一样才对啊,因为它们是线程私有数据啊.

Thanks in advance!

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
2 [报告]
发表于 2007-05-25 16:55 |只看该作者
anything ?

论坛徽章:
0
3 [报告]
发表于 2007-05-25 16:59 |只看该作者

回复 1楼 chenzhanyiczy 的帖子

test_key_val 是全局的阿!

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
4 [报告]
发表于 2007-05-25 17:47 |只看该作者
是全局的, 你的意思是不能用全局的 ?

好像这在pthread 没有特别说明不能用全局的。

假如test_key_val不是全局的,在一个函数里的话,那利用线程私有数据有什么用? 因为每个线程都有自己的stack,显然test_key_val是不一样的, 那就不必用线程私有数据了啊???

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
5 [报告]
发表于 2007-05-25 18:51 |只看该作者
这就是传说中的TLS? 没用过.

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
6 [报告]
发表于 2007-05-25 19:02 |只看该作者
没人知道吗?

论坛徽章:
0
7 [报告]
发表于 2007-05-25 19:23 |只看该作者

回复 4楼 chenzhanyiczy 的帖子

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
8 [报告]
发表于 2007-05-28 11:56 |只看该作者
谢谢gaocheng。
其实我看过这篇文章,个人觉得写的不是很好,它的例子根本没有体现线程私有数据的特性。

谁还知道吗?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
9 [报告]
发表于 2007-05-28 15:55 |只看该作者
怎么大家都没用过多线程在linux???

论坛徽章:
0
10 [报告]
发表于 2007-05-28 16:30 |只看该作者
原帖由 chenzhanyiczy 于 2007-5-25 15:07 发表
关于pthread_key,有一些问题,下面用例子来说明:

pthread_key_t p_key;

char test_key_val[30];

main
{
  pthread_key_create(&p_key,NULL);
  
  pthread_create(&p_thread_id[1],NULL,a ...


楼主下次再贴代码时,最好把你的代码贴全,方便别人帮你

不知道楼主怎么能将你的代码编译通过的,还有一些语法错误

下面是我根据你的代码修改的


  1. #include <pthread.h>

  2. pthread_key_t p_key;

  3. char test_key_val[30];


  4. a()
  5. {
  6.   strcpy(test_key_val,"I am a");
  7.   pthread_setspecific(p_key,test_key_val);

  8.   printf("Test_key_val is [%s] in a function\n",test_key_val);
  9. }

  10. b()
  11. {
  12.   strcpy(test_key_val,"I am b");
  13.   pthread_setspecific(p_key,test_key_val);

  14.   printf("Test_key_val is [%s] in b function\n",test_key_val);
  15. }

  16. int main()
  17. {

  18.   pthread_t p1, p2;
  19.   
  20.   pthread_key_create(&p_key,NULL);
  21.   
  22.   pthread_create(&p1,NULL,a,NULL);
  23.   pthread_create(&p2,NULL,b,NULL);
  24.   
  25.   pthread_join(p1, NULL);
  26.   pthread_join(p2,NULL);
  27. }

复制代码

运行结果是:
Test_key_val is [I am a] in a function
Test_key_val is [I am b] in b function

跟你的代码基本上没有区别
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP