【问题标题】:Win32 CreateThread() Arguments Zero'ed?Win32 CreateThread() 参数归零?
【发布时间】:2017-03-10 11:47:19
【问题描述】:

情况

直到昨天,我的线程代码工作正常。但现在,我的线程参数在传递到线程时被归零和移动。

ma​​in.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);

在这个阶段UDPSocket是正确的值(例如103),pNetwork也是正确的。

UDPListen()中的相关代码

    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;
    }

在此状态下,值应为应有的值。

Listen()中的相关代码

    static DWORD WINAPI Listen(void *param)
    {
        ListenData *UDPServ = (ListenData*)param;
        SOCKET Socket = UDPServ->LocalUDPSocket;
        std::vector<Net> *Network = UDPServ->pNetwork;

然而,现在UDPSocket 为零,pNetwork 为 103。这是个谜。

我真正改变的唯一代码是初始化服务器的代码,我对其进行了修改以结合绑定 TCP 套接字。该函数用于返回单个SOCKET,但现在返回std::pair&lt;SOCKET, SOCKET&gt;

【问题讨论】:

  • 我怀疑您应该通过引用传递UDPListenDatastatic HANDLE UDPListen(ListenData&amp; UDPListenData)。目前您似乎正在获取按值传递的临时参数的地址:&amp;UDPListenData

标签: c++ multithreading sockets winapi


【解决方案1】:

您将指针传递给堆栈中的本地数据 - &amp;UDPListenData - 但在 UDPListen 返回后,此数据将变为未定义。你可能需要像

这样的代码
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;
}

【讨论】:

  • 仍然失去价值:S
  • @SyntheticAscension - 所以您的代码中仍有一些错误,这是不可见的。但在以前的代码错误中肯定是在将堆栈中的临时对象指针传递给另一个线程
  • 现在没关系,谢谢。关于UDPListen() 在其他函数访问值之前返回一个值,您是对的。我在main中声明UDPServ,然后通过地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多