std::线程错误:无效使用void表达式



我必须使用套接字(不使用boost库(将数据(通过TCP(从客户端发送到服务器。

我在cpp文件中的实现:

void Server::SendXBytes(int socket, unsigned int x, void* buffer)
{
int bytesSent = 0;
int result;
int* bufferint = (int*)buffer;
while (bytesSent < x)
{
result = read(socket, bufferint + bytesSent, x - bytesSent);
if (result < 1)
{
cout << "Error sending bytes" << endl;
}
}
}

然后我在下面的main.cpp中使用它:

#include "client.cpp"
#include "server.cpp"
#include <thread>
int main()
{
int server_id;
int socket;
Server server(1024);
Client client(1024);
int server_fd = server.createSocket(server_id);
server.PrepareSocket(server_fd);
server.AcceptConn(server_fd, socket);
int* buffer = new int[2000];
std::thread client_th(client.SendXBytes(socket, 512, (void*)buffer));
std::thread server_th(server.ReadXBytes(socket, 512, (void*)buffer));
server_th.join();
client_th.join();
}

编译时返回错误:

main.cpp:15:70: error: invalid use of void expression
std::thread server_th(server.ReadXBytes(socket, 512, (void*)buffer));
^
main.cpp:16:70: error: invalid use of void expression
std::thread client_th(client.SendXBytes(socket, 512, (void*)buffer));

我尝试了一些解决方案,但还是出现了同样的错误。。。。

std::thread client_th(client.SendXBytes(socket, 512, (void*)buffer));

这直接调用SendXBytes函数,将其返回值(即void(传递给std::thread构造函数,从而导致错误。你可能想做的是把这个调用包装成这样的lambda:

std::thread client_th([&]{ client.SendXBytes(socket, 512, (void*)buffer); });

如果你从未听说过lambdas,你也许可以读一读。确保您理解通过引用(如这里所示(或使用=而不是&通过值捕获外部变量的含义。在这种情况下,通过引用捕获是可以的,但如果线程的寿命可能超过捕获的变量,则会导致未定义的行为。

相关内容

  • 没有找到相关文章

最新更新