【问题标题】:Multiple arguments (with struct) error using pthread使用 pthread 的多个参数(带结构)错误
【发布时间】:2013-01-11 01:47:57
【问题描述】:

我正在开发一个多客户端聊天项目。

这是我的代码:

struct RecvDataModel
{
    int sockAddr;
    char *inData;
};

void *ProcessData(void *arg);

void Client::Recv(int sockAddr, char *inData)
{
    RecvDataModel outData;
    outData.sockAddr = sockAddr;
    outData.inData = inData;
    pthread_t rThr;
    pthread_create(&rThr, NULL, ProcessData, (void*)&outData);
}

void *ProcessData(void *arg)
{
    RecvDataModel *inData = (RecvDataModel*)arg;
    cout << inData->inData << endl;
    return 0;
}

如果 sockAddr(在 Client::Recv 中)等于“55”,则 ProcessData 的 cout 函数写为“31784736”,如果等于“0”,则 cout 的“5120”

这是我的大问题!没有这个我不能继续! (我正在使用eclipse C++) 有什么问题?我已经看过一些这样的示例项目:Link >>>

【问题讨论】:

    标签: c++ struct pthreads arguments


    【解决方案1】:

    不要传递指向超​​出范围的局部变量的指针。一旦你创建了那个线程,outData 就不再有效了,所以你给它的指针是没有用的。您需要使用static 限定符声明outData,或者为它动态分配空间,以便在Client::Recv 返回时它不会消失。

    【讨论】:

      【解决方案2】:

      您正在传递一个指向 RecvDataModel 的指针,它是一个函数局部变量。它将在Client::Recv 函数结束时超出范围。

      尝试使用 new 来分配它:

      RecvDataModel * outData = new RecvDataModel();
      outData->sockAddr = sockAddr;
      outData->inData = inData;
      pthread_t rThr;
      pthread_create(&rThr, NULL, ProcessData, outData);
      

      【讨论】:

      • 现在它是 sockAddr "0" 的 "32041692" 编辑:对不起,它有效! (第一次没有工作,因为我使用了“pthread_create(&rThr,NULL,ProcessData,&outData);”而不是“pthread_create(&rThr,NULL,ProcessData,outData);”非常感谢!:)
      • @freaka61 你可能想在ProcessData() 中删除inData 以避免内存泄漏。
      • @JoachimIsaksson 怎么样?喜欢关闭()?
      • 嗯,我可以在 ProcessData() 中删除它吗?
      • 这样? void Client::Recv(int sockAddr, char *inData) { ... 删除 outData; } 和 void *ProcessData(void *arg) { ... 删除 inData; }
      猜你喜欢
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      相关资源
      最近更新 更多