我需要一些帮助,解决我遇到过的一些问题。 最重要的是,我的计划。
我正在编写一个简单的服务器 - 客户端程序,其中从服务器发送的消息在一个独立线程的队列中被输入。 然后,有另一个线程读取该队列并执行消息。
这样的事情:
这将是一个主题:
DWORD WINAPI recieveMessage(void* client)
{
std::string msg;
char buffer[MAX_SIZE];
memset(buffer, 0, MAX_SIZE);
while(TRUE){
if (!((ClientInterpreter*)client)->receive(buffer,sizeof(buffer)))
return -1;
if (sizeof(buffer) == 0){
memset(buffer, 0, MAX_SIZE);
continue;
}
msg = string(buffer);
((ClientInterpreter*)client)->storeMessage(msg);
memset(buffer, 0, MAX_SIZE);
msg.clear();
}
}
storeMessage执行此操作:
void ClientInterpreter::storeMessage(std::string msg)
{
WaitForSingleObject(INmutex,INFINITE);
incomingQueue->push(msg);
ReleaseMutex(INmutex);
}
另一个线程,即读取队列的线程在while循环中调用此函数:
std::string ClientInterpreter::getIncomingMessage() {
std::string retorno;
WaitForSingleObject(INmutex,INFINITE);
if( incomingQueue->empty() ){
ReleaseMutex(INmutex);
return "0";
}
retorno = incomingQueue->front();
incomingQueue->pop();
ReleaseMutex(INmutex);
return retorno;
}
首先,我不知道我是否正在使用互斥体怀特,但它有效(没有出现并发访问错误),所以我不打扰。
我在这上面运行了一个分析器,我得到了大量的内存泄漏,所有这些都来自queue :: push_back。 就像pop函数不会破坏对象一样。是否必须对线程做任何事情? 还有什么我做错了吗?
答案 0 :(得分:0)
您的代码通常对我来说似乎没问题。当你说queue :: push_back()时,你的意思是推,对吧?因为您在代码中正确使用了push()。希望你没有在事故中使用push_back(),因为那将是deque :: push_back(),而不是队列。
在2个小点上。
第一点是
if (!((ClientInterpreter*)client)->receive(buffer,sizeof(buffer)))
return -1;
在这里,如果它会返回不同的结果!触及(((ClientInterpreter*)client)->receive(buffer,sizeof(buffer)))
而不是((ClientInterpreter*)client)->receive(buffer,sizeof(buffer))
?我问,因为你可能比我更了解。我通常会特别小心并用额外的括号覆盖我的基础,所以我不完全确定对语法的影响。
第二点,我知道这是挑剔的,但也许recieveMessage(void* client)
拼写错误并且receive
正确拼写可能会在我们看不见的地方做些什么。
如果这没有帮助,请向我们提供有关您的测试及其结果的更多信息。你得到一个明确的seg错误吗?或者你只是注意到某些泄漏?你试过gdb吗?等