Closed chakloong883 closed 5 months ago
我这边没有遇到内存泄漏的问题。 之前倒是有一个重复释放内存的问题,不过那个bug我已经修复了。
我这边没有遇到内存泄漏的问题。 之前倒是有一个重复释放内存的问题,不过那个bug我已经修复了。
好的,想问一下您在推理时加了一把outputslock,请问为什么需要加这个outputs_lock_呀
我这边没有遇到内存泄漏的问题。 之前倒是有一个重复释放内存的问题,不过那个bug我已经修复了。
好的,想问一下您在推理时加了一把outputslock,请问为什么需要加这个outputs_lock_呀
就是解决上面我说的内存重复释放的问题。这个是线程安全的问题,没有这个锁的话。你在操作同一个推理的输出的时候会发生 写内存 写内存 释放 释放, 第二次写覆盖了第一次写的,但是第二次释放的时候会重复释放。
我这边没有遇到内存泄漏的问题。 之前倒是有一个重复释放内存的问题,不过那个bug我已经修复了。
好的,想问一下您在推理时加了一把outputslock,请问为什么需要加这个outputs_lock_呀
就是解决上面我说的内存重复释放的问题。这个是线程安全的问题,没有这个锁的话。你在操作同一个推理的输出的时候会发生 写内存 写内存 释放 释放, 第二次写覆盖了第一次写的,但是第二次释放的时候会重复释放。
好的,感谢
内存 释放 释放, 第二次写覆盖了
我发现在循环使用线程池的时候,如果调用时间占用较长的话,资源有可能得不到有效释放,越积越多,比如下面的例子,内存占用会逐渐增大。在推理较大的模型时,推理时间较长,应该也像这样的效果。
#include <iostream>
#include <memory>
#include "ThreadPool.h"
int main() {
ThreadPool pool(4);
while(true) {
pool.enqueue([]{
unsigned char* data = new unsigned char[640*640*3];
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 延时1s
delete []data;
});
printf("count+1\n");
}
}
内存 释放 释放, 第二次写覆盖了
我发现在循环使用线程池的时候,如果调用时间占用较长的话,资源有可能得不到有效释放,越积越多,比如下面的例子,内存占用会逐渐增大。在推理较大的模型时,推理时间较长,应该也像这样的效果。
#include <iostream> #include <memory> #include "ThreadPool.h" int main() { ThreadPool pool(4); while(true) { pool.enqueue([]{ unsigned char* data = new unsigned char[640*640*3]; std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 延时1s delete []data; }); printf("count+1\n"); } }
阿 这。。。我觉得你应该去了解一下缓存队列是什么。 或者类似的了解一下生产者和消费者模型,处理不不过来可能会积累的哈
内存 释放 释放, 第二次写覆盖了
我发现在循环使用线程池的时候,如果调用时间占用较长的话,资源有可能得不到有效释放,越积越多,比如下面的例子,内存占用会逐渐增大。在推理较大的模型时,推理时间较长,应该也像这样的效果。
#include <iostream> #include <memory> #include "ThreadPool.h" int main() { ThreadPool pool(4); while(true) { pool.enqueue([]{ unsigned char* data = new unsigned char[640*640*3]; std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 延时1s delete []data; }); printf("count+1\n"); } }
阿 这。。。我觉得你应该去了解一下缓存队列是什么。 或者类似的了解一下生产者和消费者模型,处理不不过来可能会积累的哈
好的
我在参考您的方案修改yolov5的demo,发现循环时设置较小的延时,并且推理较大的模型(如yolov5m),设置线程数为3时可能会发生内存泄漏问题,请问您有没有遇到类似的情况。