我正在编写一个多线程程序,使用Intel TBB在C ++中填充/读取并发优先级队列,当打印连续的弹出元素时,我发现内存泄漏。如果不将它们打印到终端或使用单个线程填充并弹出队列,则不会发生这种情况。我不知道那可能来自哪里,有人可以帮忙吗?
注意:使用STL队列或priority_queue
时发生了同样的事情英特尔TBB并发优先级队列文档: https://www.threadingbuildingblocks.org/docs/help/reference/containers_overview/concurrent_priority_queue_cls.htm
我写了一个与我的程序类似的小例子来演示我的问题:
#include <iostream>
#include <memory>
#include <thread>
#include "tbb/concurrent_priority_queue.h"
typedef tbb::concurrent_priority_queue<std::shared_ptr<int>> EventQueue;
void Fill(EventQueue* _queue,uint64_t N)
{
for (uint64_t i=0; i<N; ++i)
_queue->emplace(new int{1});
}
void Read(EventQueue* _queue,uint64_t N)
{
std::shared_ptr<int> currentEvent;
uint64_t count=0;
while (count<=N) {
if (!_queue->empty()) {
bool test = _queue->try_pop(currentEvent);
std::cout << *currentEvent.get() << std::endl;
++count;
}
}
}
int main()
{
EventQueue eventQueue;
uint64_t N = 1e10;
std::thread fill_thread(Fill,&eventQueue,N);
std::thread read_thread(Read,&eventQueue,N);
fill_thread.join();
read_thread.join();
}
我正在使用大整数值,因为我正在处理数十亿行的数据库,似乎大N值导致泄漏,因为当使用较小的N如1000000时没有发生内存泄漏,说实话我真的不需要在多线程期间打印到终端但看到发生这种情况我很想知道原因。