【发布时间】:2014-05-16 23:59:25
【问题描述】:
我需要一些帮助来解决我遇到的一些问题。 首先是我的程序。
我正在编写一个简单的服务器-客户端程序,其中从服务器发送的消息在一个独立线程中的队列中排队。 然后,有另一个线程读取该队列并执行消息。
类似这样的:
这将是一个线程:
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 函数不会破坏对象一样。它与线程有什么关系吗? 还有什么我做错了吗?
【问题讨论】:
-
输出
incomingQueue的大小,你插入字符串的频率可能比删除字符串的频率高
标签: c++ multithreading memory-leaks thread-safety queue