C++ Win32 CreateThread()参数为零';预计起飞时间?

C++ Win32 CreateThread()参数为零';预计起飞时间?,c++,multithreading,sockets,winapi,C++,Multithreading,Sockets,Winapi,形势 static HANDLE UDPListen(ListenData UDPListenData) { HANDLE NetworkThread; NetworkThread = CreateThread( NULL, //Default security 0, //Default th

形势

    static HANDLE UDPListen(ListenData UDPListenData)
    {
        HANDLE NetworkThread;
        NetworkThread = CreateThread(
            NULL,                           //Default security
            0,                              //Default thread stack size
            Network::Operations::Listen,    //Thread function name
            &UDPListenData,                 //Thread arguments
            0,                              //Default creation flags
            NULL);

        //CloseHandle(NetworkThread);
        return NetworkThread;
    }
    static DWORD WINAPI Listen(void *param)
    {
        ListenData *UDPServ = (ListenData*)param;
        SOCKET Socket = UDPServ->LocalUDPSocket;
        std::vector<Net> *Network = UDPServ->pNetwork;
直到昨天,我的线程代码还可以正常工作。但是现在,我的线程参数在传递到线程时被归零并移动

main.cpp中的相关代码

//First socket: UDP | Second Socket: TCP
std::pair<SOCKET, SOCKET> ServerSockets = Network::Operations::Server();
SOCKET UDPSocket = ServerSockets.first;

//Need to pass two arguments to the thread, when it only accepts one pointer. So create a struct and send the pointer.
ListenData UDPServ;
UDPServ.pNetwork = &Network;
UDPServ.LocalUDPSocket = UDPSocket;
//Set up the listener.
HANDLE UDPListener = Network::Operations::UDPListen(UDPServ);
在这种状态下,值与它们应该的一样

Listen()中的相关代码

静态DWORD WINAPI侦听(void*param)
{
ListenData*UDPServ=(ListenData*)参数;
套接字SOCKET=UDPServ->LocalUDPSocket;
std::vector*Network=UDPServ->pNetwork;
然而现在,
UDPSocket
是零,
pNetwork
是103。这是一个谜


我真正更改的唯一代码是初始化服务器的代码,我将其修改为包含绑定TCP套接字。该函数用于返回单个
socket
,但现在返回一个
std::pair
,您将指针传递到堆栈中的本地数据-
&UDPListenData
,但该数据随后就变得未定义er
UDPListen
return。您可能需要这样的代码

ListenData* UDPServ = new ListenData;
// init UDPServ

HANDLE NetworkThread = CreateThread(
            NULL,                           //Default security
            0,                              //Default thread stack size
            Network::Operations::Listen,    //Thread function name
            UDPServ,                 //Thread arguments
            0,                              //Default creation flags
            NULL);

if (!NetworkThread) delete UDPServ;

//...

static DWORD WINAPI Listen(void *param)
    {
        ListenData *UDPServ = (ListenData*)param;
        SOCKET Socket = UDPServ->LocalUDPSocket;
        std::vector<Net> *Network = UDPServ->pNetwork;
    //...
    delete UDPServ;
}
listenda*UDPServ=新的listenda;
//初始化UDPServ
HANDLE NetworkThread=CreateThread(
NULL,//默认安全性
0,//默认线程堆栈大小
网络::操作::侦听,//线程函数名
UDPServ,//线程参数
0,//默认创建标志
无效);
如果(!NetworkThread)删除UDPServ;
//...
静态DWORD WINAPI侦听(void*param)
{
ListenData*UDPServ=(ListenData*)参数;
套接字SOCKET=UDPServ->LocalUDPSocket;
std::vector*Network=UDPServ->pNetwork;
//...
删除UDPServ;
}

我怀疑您应该通过引用传递
UDPListenData
静态句柄UDPListen(listenda&UDPListenData)
。当前,您似乎正在获取通过值传递的临时参数的地址:
&UDPListenData
仍然丢失值:S@SyntheticAscension-所以您的代码中仍然存在一些错误,这些错误是不可见的。但在以前的代码中,将堆栈中的临时对象指针传递到另一个线程中肯定会出现错误。现在,请不要担心,谢谢s、 关于
UDPListen()
在另一个函数访问值之前返回一个值的问题,您是对的。我在main中声明
UDPServ
,然后传递地址。