这里的问题是,boost::lockfree::queue在分配内存后不会释放内存。为什么自由列表节点没有返回到操作系统?调用单个集合对象上的析构函数。
我想解决内存问题,关于无锁定队列内存分配的任何建议。我在这里做错了什么?
#include <iostream>
#include <Windows.h>
#include <boost/thread/thread.hpp>
#include <boost/lockfree/queue.hpp>
using namespace std;
using namespace boost;
struct Record
{
char str[128];
Record(const char* rec)
{
memset(this->str, 0, sizeof(this->str));
strcpy_s(this->str, rec);
}
~Record()
{
cout << "~Record " << this->str << endl;
}
Record& operator= (const Record& rec)
{
if (this == &rec)
{
return *this;
}
memset(this->str, 0, sizeof(this->str));
strcpy_s(this->str, rec.str);
return *this;
}
};
typedef boost::lockfree::queue<Record*, boost::lockfree::fixed_sized<true>> RecordsQueue;
RecordsQueue Records(10000);
class MyClass
{
public:
void FillThread()
{
int i = 0;
while (true)
{
Record *rec = new Record(to_string(i).c_str());
Records.push(rec);
i++;
};
}
void ProcessThread()
{
while (true)
{
Record *rec;
Records.pop(rec);
{
cout << "Record " << rec->str << endl;
delete rec;
}
};
}
};
int _tmain(int argc, _TCHAR* argv[])
{
boost::thread* thread1, *thread2;
MyClass myObj;
thread1 = new boost::thread(boost::bind(&MyClass::FillThread, myObj));
HANDLE threadHandle1 = thread1->native_handle();
SetThreadPriority(threadHandle1, THREAD_PRIORITY_NORMAL);
boost::this_thread::sleep(boost::posix_time::seconds(1));
thread2 = new boost::thread(boost::bind(&MyClass::ProcessThread, myObj));
HANDLE threadHandle2 = thread2->native_handle();
SetThreadPriority(threadHandle2, THREAD_PRIORITY_NORMAL);
thread1->join();
thread2->join();
return 0;
}
看起来您向队列中推送的记录比可用空间多。这会覆盖以前拥有的空间,并导致这些空间将来不会被释放。尝试将FillThread更改为for循环。