带有std::线程强制转换变量的c++多线程服务器
c++ multithreaded server with std::thread casting variables
我刚刚开始在c++编码,我试图建立一个多线程服务器,但我得到了一些错误。首先,这是我得到的代码:
while(true){
printf("waiting for a connectionn");
csock = (int*)malloc(sizeof(int));
if((*csock = accept( hsock, (sockaddr*)&sadr, &addr_size))!= -1)
{
printf("---------------------nReceived connection from %sn",inet_ntoa(sadr.sin_addr));
//std::thread th(&Network::SocketHandler, NULL);
std::thread th(Network::SocketHandler, (void*)csock);
th.detach();
}
else
{
fprintf(stderr, "Error accepting %dn", errno);
}
}
}
void Network::SocketHandler(void* lp)
{
int *csock = (int*)lp;
char buffer[1024];
int buffer_len = 1024;
int bytecount;
memset(buffer, 0, buffer_len);
if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){
fprintf(stderr, "Error receiving data %dn", errno);
}
printf("Received bytes %dnReceived string "%s"n", bytecount, buffer);
strcat(buffer, " SERVER ECHO");
if((bytecount = send(*csock, buffer, strlen(buffer), 0))== -1){
fprintf(stderr, "Error sending data %dn", errno);
}
printf("Sent bytes %dn", bytecount);
}
我在这行编译时得到一个错误:
std::thread th(Network::SocketHandler, (void*)csock);
说:std::线程:线程(_Args&_Callable&,,,(与_Callable…)=无效(网络::) (int );_Args = {void*}]没有已知的参数1从' '到' '的转换void (Network::&&)(int) '
如何解决这个问题?或者有没有更好的方法来创建一个多线程服务器,其他帖子的任何例子?
当你很清楚你真正想要的是int *
时,为什么你要传递void *
而不是int *
?
只需将函数签名更改为:
void Network::SocketHandler(int* csock)
并删除调用代码中的强制转换:
std::thread th(Network::SocketHandler, csock);
现在,你仍然会得到一个错误,它将是一个不同的原因。Network::SocketHandler
是一个成员函数。它需要一个this
指针。通常你会用object.SocketHandler(csock)
或objptr->SocketHandler(csock)
这样的语法来调用这样的函数。当你用::std::thread
那样调用它时,你并没有给它一个要调用的对象。没有this
指针
你应该做的是再次修改函数签名为:
static void Network::SocketHandler(int* csock)
,然后你的代码将正常工作。看起来这个函数没有使用任何成员变量,所以它不需要this
指针。
另一个注意事项,它看起来像是你试图改编最初为pthreads编写的东西。如果我要为c++ 11线程库做这件事,我会用一种完全不同的方式来做。
我不能看到你的整个程序,所以我真的没有重新设计它的奢侈。但是,从我所看到的,我会做这些调整:
while(true){
printf("waiting for a connectionn");
int csock = -1;
if((csock = accept( hsock, (sockaddr*)&sadr, &addr_size))!= -1)
{
printf("---------------------nReceived connection from %sn",inet_ntoa(sadr.sin_addr));
//std::thread th(&Network::SocketHandler, NULL);
std::thread th(Network::SocketHandler, csock);
th.detach();
}
else
{
fprintf(stderr, "Error accepting %dn", errno);
}
}
}
void Network::SocketHandler(int csock)
{
char buffer[1024];
int buffer_len = 1024;
int bytecount;
memset(buffer, 0, buffer_len);
if((bytecount = recv(csock, buffer, buffer_len, 0))== -1){
fprintf(stderr, "Error receiving data %dn", errno);
}
printf("Received bytes %dnReceived string "%s"n", bytecount, buffer);
strcat(buffer, " SERVER ECHO");
if((bytecount = send(csock, buffer, strlen(buffer), 0))== -1){
fprintf(stderr, "Error sending data %dn", errno);
}
printf("Sent bytes %dn", bytecount);
}
这些变化相当微妙。c++ 11线程库允许您调用函数并提供它们的所有参数,并以线程安全的方式处理此问题。没有必要再传递void *
,也没有必要使用malloc
或new
来为那些参数创建存储空间,你可以直接将线程需要的参数传递给线程构造函数。
实际上,您的程序存在内存泄漏。它从不回收malloc
为csock
所指向的空间。如果它运行了很长时间,它最终会耗尽内存,因为所有这些文件句柄的空间都没有被回收。
您的程序也可能有文件句柄泄漏。您没有出现close
Network::SocketHandler
中的套接字。但是因为我不能看到你的整个程序,所以我不能确定。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误