问题:访问线程内的向量

时间:2011-03-20 10:21:08

标签: c++

当我尝试访问线程外的向量时出现链接错误。我的设计是,当我从客户端收到消息时,我希望按摩或数据在我的数据队列中以便进一步操作。但我无法让他们工作。这是我的代码:

.cpp文件:

// Inside the recv thread
start:
    err = recvfrom(RecvSocket, lpData->RecvBuf, BufLen, 0, (SOCKADDR *)&lpData->SenderAddr, &SenderAddrSize);
    //lpData is used to access Recv Structure which stores the attributes of the server and client.

    switch(lpData->port)
    {
        case 6516:
        {
            BuffStack1.push_back(lpData->RecvBuf);
            break;
        }

        case 6517:
        {   
            break;
        }

        case 6518:
        {
            break;
        }
    }

goto start;

.h文件:

class CUdpSocket
{
public:
    CUdpSocket(void);
    ~CUdpSocket(void);
    void ServerRecv(int port);
    void ClientSend(const char *ip, int port, const char *buff);
    unsigned static __stdcall ServerRecvThread(void *arguments);
    unsigned static __stdcall ClientSendThread(void *arguments);
    CString static Itoa(int data);
    void Mix();

private:
    RecvStruct *pRecvData;
    SendStruct *pSendData;
    vector<HANDLE>threadStl;
    static vector<char*>BuffStack1;  // Here is my stack vector
    static vector<char*>BuffStack2;
    static vector<char*>BuffStack3;
    HANDLE hThread;
    unsigned threadID;
    static BufferData *ptrBufferData;
};

我是否需要放置静态有点困惑。当我放静态时,错误将是:

error LNK2001: unresolved external symbol "private: static class std::vector<char *,class std::allocator<char *> > CUdpSocket::BuffStack1" (?BuffStack1@CUdpSocket@@0V?$vector@PADV?$allocator@PAD@std@@@std@@A)

如果我没有放静态语句,错误说:

error C2228: left of '.push_back' must have class/struct/union

请帮忙。

谢谢。

1 个答案:

答案 0 :(得分:3)

我认为问题在于,在C ++中,在类中使用static数据成员是一个两步过程。首先,你需要声明 static变量,表明它有一个名称和类型,然后你必须定义 static变量到在其中一个翻译单元中给它存储空间。我的猜测是你已经完成了第一步而不是第二步。

要定义static变量,请将类似这样的定义放入.cpp文件中:

vector<char*> CUdpSocket::BuffStack1;

请注意,您在此处重复static关键字。相反,您只需提供static数据成员的类型和完全限定名称。如果要为static数据成员使用非默认构造函数,也可以在此处执行此操作。

希望这有帮助!

PS。请不要使用标签和goto来实现循环...请改用while(true)循环! : - )

编辑:如果您要从该主题访问这些vector,请确保您已进行适当的同步。从多个线程读取和写入vector是不安全的,而不确保最多一个线程可以在任何时候修改它。