打印

pthread_create中参数传递不正确

[复制链接]
3270|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
S3C2440|  楼主 | 2010-7-30 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
typedef struct {
        int     param1;
        int     param2;
        int     param3;
        int     param4;
}agent_threadParma;

int canReceive(void *pParams)
{
        agent_threadParma  *param;
        param = (agent_threadParma*)pParams;
        fd = param ->param1;  //此数传递有时正确有时不正确
          while(1)
                   {
                            ......
                   }
}

int cansio_open()
{
        agent_threadParma   threadParams;  //自定义结构
    pthread_t           canthread;
        int fd;   

......
        fd = open( candev, O_RDWR|O_NONBLOCK );
       if (-1 == fd)
      {
          perror("Can't can Port");
          return -1;
      }
      threadParams.param1 = fd;
     pthread_create(&canthread,NULL,(void *)canReceive,(void*)&threadParams);
   .......
}

我使用 pthread_create来产生线程,但是 threadParams.param1 参数传递传递有时正确有时不正确,我不知到为什么会
这样,谁能给我分析一下?

相关帖子

沙发
北京户口| | 2010-7-30 22:04 | 只看该作者
你这段代码肯定有问题,你要传递的参数结构体存在于函数栈上,当函数执行完成后,就被释放了,
所以等到线程开始执行时得到的参数就是个不确定值。其实这个问题的主要原因在于被创建的线程何时执行,
如果
1) 立刻执行,那么传递的参数正确
2) cansio_open()结束后某个时刻执行,那如前所述肯定错误

所以你应该采用静态静态结构体或者动态分配,比如采用动态分配

int canReceive(void *pParams)
{
        agent_threadParma  *param;
        param = (agent_threadParma*)pParams;
        fd = param ->param1;  //此数传递有时正确有时不正确

    /* 如果你只是用来传递fd, 那么此时你应该释放内存 */
        free(param);        

          while(1)
                   {
                            ......
                   }
}

int cansio_open()
{
    agent_threadParma *threadParams = (agent_threadParma *)malloc(sizeof(*threadParams));

    ...

    threadParams->param1 = fd;
    pthread_create(&canthread,NULL,(void *)canReceive,&threadParams);

    ...
}

使用特权

评论回复
板凳
无冕之王| | 2010-7-31 09:11 | 只看该作者
楼上的回答得可真够详细的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

400

帖子

1

粉丝