类vector类型的成员在线程中push_back报错
[code=c++]
// 代码:
int SyncTcpServer::start()
{
if (stopRunning) return 0;
listenThread = ::CreateThread(NULL,
0, listenClient, this, 0, NULL);
return 0;
}
// 线程
DWORD WINAPI SyncTcpServer::listenClient(LPVOID arg)
{
SyncTcpServer *pThis = (SyncTcpServer *)arg;
sockaddr_in addr;
int addrLen = sizeof(sockaddr_in);
SOCKET s;
while (!pThis->stopRunning) {
s = accept(pThis->sock, (sockaddr *)&addr, &addrLen);
if (s == INVALID_SOCKET) {
pThis->onServerClosed();
break;
}
pThis->newClientAccepted(s, addr);
}
return 0;
}
void SyncTcpServer::newClientAccepted(SOCKET s, sockaddr_in addr)
{
if (s == INVALID_SOCKET) {
/* something didn't expected happened */
return ;
}
addSock(s, inet_ntoa(addr.sin_addr));
onNewClientAccepted(inet_ntoa(addr.sin_addr));
HANDLE thrd = ::CreateThread(NULL, 0, handleClient, this, 0, NULL);
handleThreads.push_back(thrd);
}
void SyncTcpServer::addSock(SOCKET s, std::string ipAddr)
{
::WaitForSingleObject(mutex, INFINITE);
ClientDesc *newClient = new ClientDesc(s, ipAddr);
clients.push_back(newClient); //出错地
::ReleaseMutex(mutex);
}
// push_back内部出错地
iterator insert(const_iterator _Where, const _Ty& _Val)
{ // insert _Val at _Where
size_type _Off = size() == 0 ? 0 : _Where - begin();
_Insert_n(_Where, (size_type)1, _Val); //确切出错地
return (begin() + _Off);
}
[/code]
// 类型
struct ClientDesc {
ClientDesc(SOCKET sock, std::string addr)
: s(sock), unHandled(true), ipAddr(addr) {}
SOCKET s;
bool unHandled;
std::string ipAddr;
};
在clients声明之前并没有任何成员变量的声明,排除了clients被之前成员覆盖问题。
在调用addSock之前也没有从clients中添加或者删除任何元素,addSock第一次调用就会出错。
只有在release版本时会报错。
将clients替换为vector<int*>也会报错。
将addSock放入非线程处理函数中调用不会出错。
个人怀疑是不是在类指针在传递进线程处理函数的时候出现了某些变化。
请各位大神指点一下。