#10726 closed Bugs (invalid)
boost::lockfree::queue doesn't seem to free memory though destructors on every collection objects are invoked
Reported by: | Owned by: | timblechmann | |
---|---|---|---|
Milestone: | To Be Determined | Component: | lockfree |
Version: | Boost 1.56.0 | Severity: | Problem |
Keywords: | boost lockfree queue | Cc: |
Description
The problem here is, boost::lockfree::queue doesn't free memory once it is allocated. Why freelist nodes are not returned to OS? destructors on individual collection objects are invoked.
#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; }
Change History (2)
comment:1 by , 8 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 by , 8 years ago
It is okay to reuse the free list block. So when 10000 nodes are allocated, program will continue to iterate from 1 to 10000 nodes. I don't understand Why memory keeps on increasing, memory usage is in GBs!.... I have lockfree::queue of fixed_sized 10000.
Note:
See TracTickets
for help on using tickets.
http://www.boost.org/doc/libs/1_56_0/doc/html/lockfree/rationale.html#lockfree.rationale.memory_management