boost::lockfree::队列似乎没有释放内存,尽管每个集合对象上的析构函数都被调用

boost::lockfree::queue doesn't seem to free memory though destructor on every collection object is invoked

本文关键字:对象 集合 析构函数 调用 队列 lockfree 内存 释放 boost      更新时间:2023-10-16

这里的问题是,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循环。