免费注册 查看新帖 |

Chinaunix

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

[C] pthread_create 运行函数 传值错误。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-12 23:22 |只看该作者 |倒序浏览
10可用积分
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<5;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( pthread_create(&thread[i], NULL, &test_thread, &i)!=0 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ERROR;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("create thread--%d-- ok\n",i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;}



void *test_thread(void  *arg)

执行for的时候输出 i 的值是0,1,2,3,4。但是到了test_thread函数中输出 arg 的值却变成了0,4,4,4,4这是什么原因啊?导致后边的程序出错

谢谢了

[ 本帖最后由 xautLL 于 2009-11-12 23:29 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-11-12 23:24 |只看该作者
更详细的错误信息那?

论坛徽章:
0
3 [报告]
发表于 2009-11-12 23:53 |只看该作者
线程之间竞争的关系...


  1. for(i=0;i<5;i++)
  2.   {
  3.    err =  pthread_create(&ntid[i], NULL, thr_fn, &i);
  4.    if(err!=0)
  5.     {
  6.      printf("error\n");
  7.      return 0;
  8.     }
  9.    sleep(1);
  10.    printf("main:%d\n", i);
  11.   }
  12.   
  13.   sleep(2);

复制代码

加几个sleep你就清楚了...

论坛徽章:
0
4 [报告]
发表于 2009-11-13 00:29 |只看该作者
你传给pthread_create的值是i的地址,不是真实的i的值。

所以,你第一个线程运行的时候,是0,然后后面几个线程,都是等你的主线程到4的时候,才开始执行的。

这0,4,4,4,4,根本没什么参考的意义。因为你五个线程,传进去的都是一个指向i的指针,i变线程里面就也变。

你应该直接传i进去,不是传i的地址。然后在test_thread中直接取值,不要取值指向的值就对了。

呵呵!

论坛徽章:
0
5 [报告]
发表于 2009-11-13 17:36 |只看该作者
自己搞定了,发帖的时候太着急了,没有想到,不用传i的值,单独定义了一个int数组。

论坛徽章:
0
6 [报告]
发表于 2009-11-13 21:07 |只看该作者
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void * test(void * arg)
{
&nbsp;&nbsp;&nbsp;&nbsp;printf("%lu : %dn", pthread_self(), *(int *)arg);
}
int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int i, thread[5];
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<5;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( pthread_create(&thread[i], NULL, &test, &i)!=0 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("create thread--%d-- okn",i);


&nbsp;&nbsp;&nbsp;&nbsp;}
}


输出:(open SUSE 11.1)
3085187984 : 0
create thread--0-- ok
3076795280 : 1
create thread--1-- ok
3068402576 : 2
create thread--2-- ok
3060009872 : 3
create thread--3-- ok
3051617168 : 4
create thread--4-- ok

论坛徽章:
0
7 [报告]
发表于 2009-11-14 15:41 |只看该作者

回复 #6 bert1984 的帖子

严重错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP