Я пытался преобразовать программу из системы UNIX в свою систему Windows. Пока что у меня был большой успех, но когда дело доходит до этого кода:
// Spawn thread to handle the client
pthread_t threadid;
pthread_create(&threadid, NULL, handle_client, (void *)&new_socket);
У меня проблемы, и я не могу правильно сформулировать аргументы.
Вот что я сейчас пытаюсь:
// Spawn thread to handle the client
thread threadid;
thread(&threadid, NULL, handle_client, (void*)&new_socket);
Однако мой компилятор выдает три ошибки, связанные с файлом заголовка моего потока.
*Error C2672 'invoke': no matching overloaded function found*
*Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Ty1 &&,_Types2 &&...) noexcept(<expr>)'*
*Error C2780 'unknown-type std::invoke(_Callable &&) noexcept(<expr>)': expects 1 arguments - 4 provided*
Я просмотрел эти ошибки и не нашел ничего, имеющего отношение к моему конкретному случаю.
вы не можете просто 1: 1 заменить pthread
на std::thread
, если вы это сделаете, вы столкнетесь с другими проблемами, например, std::thread
, который выходит за рамки, но не присоединен и не отсоединен, вызовет std::terminate
@sklott Еще лучше было бы избавиться от указателя void*
и просто передать new_socket
по значению в handle_client()
. Это означает изменение подписи handle_client()
, например, с void* handle_client(void *sckt)
на void handle_client(SOCKET sckt)
... std::thread t(&handle_client, new_socket); t.detach(); ...
Что вам нужно сделать, вероятно, это:
std::thread threadid(handle_client, (void*)&new_socket);