2

私はマルチクライアントチャットプロジェクトに取り組んでいます。

これが私のコードです:

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 ++を使用しています)何が問題なのですか?私はすでにこのようないくつかのサンプルプロジェクトを見てきました:リンク>>>

4

2 に答える 2

3

RecvDataModel関数ローカル変数であるaへのポインタを渡しています。関数の最後でスコープ外になりClient::Recvます。

new代わりに次のように割り当ててみてください。

RecvDataModel * outData = new RecvDataModel();
outData->sockAddr = sockAddr;
outData->inData = inData;
pthread_t rThr;
pthread_create(&rThr, NULL, ProcessData, outData);
于 2013-01-27T17:17:12.247 に答える
2

スコープ外になるローカル変数へのポインターを渡さないでください。そのスレッドを作成するとすぐに、outDataそれはもう有効ではないので、あなたがそれに与えたポインタは良くありません。修飾子を使用して宣言するか、戻ったときに消えないように動的にスペースを割り当てる必要がoutDataありstaticますClient::Recv

于 2013-01-27T17:16:51.983 に答える