头文件中定义的线程函数给出类型强制转换错误

Thread function defined in header file is giving type cast errors

本文关键字:类型 错误 转换 函数 文件 定义 线程      更新时间:2023-10-16

请看下面的代码

Server.h

#pragma once
class Server
{
public:
    Server(void);
    ~Server(void);
    DWORD WINAPI serverThread(LPVOID param);
private:
    SOCKADDR_STORAGE from;
    int retval, fromlen, socket_type;
    char servstr[NI_MAXSERV],hoststr[NI_MAXHOST];
    SOCKET serverSocket, acceptSocket;
};

Server.cpp

此处显示一小部分

Server:Server()
{
//Code
//Passing data to thread
        DWORD threadId;
        HANDLE hdl;
        hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) serverThread,(LPVOID)acceptSocket,0,&threadId);
//Code
}

DWORD WINAPI Server::serverThread(LPVOID param)
{
//code
}

这段代码正在生成错误

 error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE'

来自

这一行
hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) serverThread,(LPVOID)acceptSocket,0,&threadId);

为什么会这样?请帮助!

非静态方法与静态或全局方法具有不同的类型。请记住,非静态成员函数有一个隐藏的参数,该参数是this指针,因此您的serverThread函数本质上具有这样的签名:

DWORD WINAPI serverThread(Server *this, LPVOID param);

所以你可以看到为什么这不起作用(甚至使用cast也不起作用——会发生奇怪的可怕的事情)。

为了使其与LPTHREAD_START_ROUTINE兼容,您需要将其设置为静态,因为静态成员函数不操作类的特定实例,因此不需要this指针:

static DWORD WINAPI serverThread(LPVOID param);

而不是传递acceptSocket作为lpParameter给CreateThread,传递this:

hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)serverThread, this,0,&threadId);

在serverThread内部,你仍然可以通过Server对象访问acceptSocket成员。