gpt4 book ai didi

c++ - boost::lockfree::queue 似乎没有释放内存,尽管调用了每个集合对象上的析构函数

转载 作者:行者123 更新时间:2023-11-28 02:38:44 26 4
gpt4 key购买 nike

这里的问题是,boost::lockfree::queue 在分配内存后不会释放内存。为什么 freelist 节点没有返回给操作系统?调用单个集合对象的析构函数。

我想解决内存问题,关于无锁队列内存分配的任何建议。我在这里做错了什么吗?

#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 循环。

关于c++ - boost::lockfree::queue 似乎没有释放内存,尽管调用了每个集合对象上的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26672692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com