C++ C++;将对象传递给线程

C++ C++;将对象传递给线程,c++,windows,multithreading,object,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向套接字发送一些测试数据) 然而,如

我有一个关于我不太理解的行为的问题:

<>我有两个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 );
和使用 线程:

只有testText()起作用

我有点困惑这是为什么。我是C++上的业余爱好者:——- < /P> 编辑:

添加了客户端类:

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;

}
};
类客户端
{
公众:
插座客户端插座;
客户()
{
}
~Client(){}
void displayMessage()
{

std::cout我猜在您的主线程中,CreateThread成功,然后您的客户端变量a超出范围,因此被销毁。

Anon可能在正确的轨道上出现超出范围的内容,但我认为这是
connectionSocket
。但是,您必须提供更多关于什么的详细信息你的意思是说
a.sendSocket()
不工作。应用程序崩溃了吗?你捕获到异常了吗?应用程序是否继续工作,但是
sendSocket()不工作
调用没有导致实际发送内容?实际问题是什么?

在第一种情况下,您传递一个connectionSocket,在第二种情况下传递一个指向客户端类型的指针。可能您的意思是:

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

在我看来,它似乎是一个超出作用域的对象。套接字只是一个int句柄值,存储在创建线程运行时线程创建函数中的一个成员中。'a'超出作用域(或者在下一个accept()返回时损坏)

尝试:

客户机a=新客户机()

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

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

来自您的客户端类

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

将其更改为:

SOCKET* clientsocket;
然后让它在你想做的时候

a.clientsocket = connectionSocket;

变量“connectionSocket”是一个指针,然后爆炸。当它没有声明为变量时,会调用复制构造函数,得到一个比以前使用的套接字全新的套接字。我认为这应该会有所帮助?

我认为他的
connectionSocket
超出了范围。如果是客户端,则
a.testText()
不起作用。我正在通过CreateThread()传递&a,而a.testText()在线程中起作用。那么它是如何超出范围的呢?a.sendSocket()使用了a.clientsocket…不应该保留在对象中吗?@user912877取决于a.clientsocket的属性。如果不是指针,则它将指向客户端套接字的地址,如果客户端套接字被销毁/删除,则它将指向未分配的内存。我不关闭()connectionSocket在任何地方,那么如何销毁/删除它?调用
a.sendSocket()时会发生什么
第二次?是否存在某种异常或其他情况?应用程序是否崩溃?不,不会崩溃,它只是不向connectionSocket aka.a.clientSocket发送数据。a.clientSocket在调试器中查看了什么?它是否仍然有效?应用程序不会崩溃,sendSocket()在connectionSocket上发送文本消息。在第一个变体中,它确实发送,在第二个变体中,它不发送。我要做的是将对象传递给线程,包括作为对象的公共变量的套接字。这样做的原因是,我可以实例化和访问线程外的对象。它看起来像
connectionSocket
是指向实际套接字的指针,因此我建议您在将套接字传递到线程后验证它是否未被破坏。您必须确保套接字的使用时间足够长,线程才能使用它。“实际问题”除非我在线程中实例化对象,否则我显然无法写入.clientsocket。我想在线程外实例化对象。它不会发送任何东西(我可以在客户端看到)@user912877调试器中有任何提示吗?当您单步执行代码时,调试器中的对象看起来是否有任何不同?由于此处的指针发现了问题,实际上我发布的两个变体在理论上都正常工作,我在代码的其他地方犯了一个错误。很抱歉浪费了您的时间:(
a.clientsocket = connectionSocket;