C ++将对象传递给线程

时间:2012-04-16 18:12:28

标签: c++ windows multithreading object

我对我不太明白的行为有疑问:

我有两种c ++代码:

CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) connectionSocket, 0, NULL ); 

主题:

Client a;
a.clientsocket = connectionSocket;
a.testText()
a.sendSocket();

工作正常(sendSocket将一些测试数据发送到套接字)。

但是如果我这样做

Client a;
a.clientsocket = connectionSocket;
CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) &a, 0, NULL );

并使用 螺纹:

a.testText();
a.sendSocket();

只有testText()有效。

我有点困惑为什么会这样。我是C ++的爱好者: - )

编辑:

添加了Client类:

class Client
{
public:
    SOCKET clientsocket;

    Client()
{
}
~Client(){}
void displayMessage()
{
        std::cout << "test message client class" << std::endl;
}
int sendSocket()
{
    char *sendbuf = "CLIENT TEST";
    send(clientsocket, sendbuf, (int)strlen(sendbuf),0);
    closesocket(clientsocket);
    return 0;

}
};

5 个答案:

答案 0 :(得分:2)

我猜测在你的主线程中CreateThread成功,然后你的Client变量a超出了范围,因此被破坏了。

答案 1 :(得分:0)

Anon 可能在正确的轨道上超出了范围,但我认为它是connectionSocket。但是,当您说a.sendSocket()不起作用时,您必须提供更多有关您的意思的详细信息。应用程序崩溃了吗?你有例外吗?应用程序是否继续有效,但sendSocket()调用未实际发送内容? 实际问题是什么?

答案 2 :(得分:0)

在第一种情况下,您传递一个connectionSocket,在第二种情况下,指向一个类型为Client的指针。也许你的意思是:

CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) a.clientsocket, 0, NULL );

答案 3 :(得分:0)

在我看来,这是一个超出范围的对象。 SOCKET只是一个int HANDLE值,并存储在一个成员中。当创建线程运行时,'a'超出了线程创建函数的范围,(或者在下一个accept()返回时被破坏)。

尝试:

客户a =新客户();

在多线程代码中在堆栈上分配对象之前,先考虑15次,然后决定动态分配。

PS - @Anon首先到达那里 - 我没注意到。

答案 4 :(得分:0)

来自您的客户端类

SOCKET clientsocket;

无论何时将其传递给线程,SOCKET都会在其上调用复制构造函数。此复制构造函数可能未定义,或者可能尝试在同一端口上打开新连接并导致其失败。

将其更改为:

SOCKET* clientsocket;

然后拥有它,以便每当你想做...

a.clientsocket = connectionSocket;

变量“connectionSocket”是一个指针然后繁荣进入炸药。如果未将其声明为变量,则会调用复制构造函数,并且您将获得一个比之前使用的套接字更全新的套接字。我认为那应该有帮助吗?