C++将对象传递给线程
C++ passing an object to a thread
我有一个关于我不太理解的行为的问题:
我有两种 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++的业余爱好者:-)
编辑:
添加了客户端类:
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;
}
};
我猜在你的主线程中,CreateThread 成功,然后你的客户端变量 a 超出范围,因此被破坏。
Anon 可能走在正确的轨道上,有些事情超出了范围,但我认为这是connectionSocket
。但是,当您说a.sendSocket()
不起作用时,您必须提供有关您意思的更多详细信息。应用程序会崩溃吗?你发现例外了吗?应用程序是否继续工作,但sendSocket()
调用未导致实际发送内容?实际问题是什么?
在第一种情况下,你传递一个connectionSocket,在第二种情况下,你传递一个指向客户端类型的指针。也许你的意思是:
CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) a.clientsocket, 0, NULL );
它是一个超出范围的对象。 SOCKET 只是一个 int HANDLE 值,存储在 a 的成员中。 当创建线程运行时,"a"超出了线程创建函数的范围(或者在下一个 accept() 返回时损坏)。
尝试:
客户端 a = 新客户端();
在多线程代码中在堆栈上分配对象之前,请三思而后行 15 次,然后决定动态分配。
PS - @Anon先到达那里 - 我没有注意到。
来自客户端类
SOCKET clientsocket;
每当您将它传递到线程中时,SOCKET 都会在其上调用复制构造函数。此复制构造函数可能未定义,或者可能尝试在同一端口上打开新连接并导致其失败。
将其更改为:
SOCKET* clientsocket;
然后拥有它,以便无论何时您想做...
a.clientsocket = connectionSocket;
变量"connectionSocket"是一个指针,然后炸药轰动。当它未声明为变量时,将调用复制构造函数,您将获得一个比以前使用的套接字全新的套接字。我认为这应该有帮助吗?
- 即发即弃 std::线程对象清理自身
- C++:处理线程本地对象销毁
- 结束另一个线程中使用的对象的生存期
- 将对象传递给多线程对象 Qt
- 运行线程和线程对象之间的关系
- 从从可调用参数创建的线程对象参数移动构造 C++11 线程
- 如何通过id获取线程对象?
- 线程对象函数 C++
- 关闭MFC对话框时多线程对象被破坏
- 线程对象的 WaitForSingleObject 在 DLL 卸载中不起作用
- 是否可以获取主线程的线程对象,并用它“join()”
- 如何在 C++11 中创建线程对象数组
- 如何在线程本身终止时删除提升线程对象
- 提升线程工作线程对象在线程完成后的重用
- 多线程对象中的堆损坏
- 从另一个对象指向线程对象:危险
- Qt 在另一个线程中排队工作线程对象的退出事件
- 线程对象在创建后立即销毁自身
- visual studio 2010 -是否有办法在旧的C/ c++编译器中使用c++ 11线程对象?
- 在c++中,两个线程/对象在一个对象集合中可以安全地做什么?