将函数移动到线程(使用 lambda)时内存泄漏
Memory leak when move function to thread (using lambda)
我有下面的代码,它使用uWebSockets作为后端的库。现在我想正确关闭,它会导致内存泄漏(使用valgrind进行检查)。
#include <App.h>
#include <thread>
#include <chrono>
int main()
{
using namespace std::chrono_literals;
us_listen_socket *token{};
auto start_server = [&token] {
uWS::App()
.listen(9001, [&token](auto *listenSocket) {
if (listenSocket) token = listenSocket;
})
.run();
};
auto start_timer = [&token] {
std::this_thread::sleep_for(2s);
us_listen_socket_close(token);
};
...
}
...
如下:
泄露版本:
std::thread(start_server).detach();
start_timer();
无泄漏版本:
std::thread(start_timer).detach();
start_server();
我知道只有当我将运行服务器的代码移动到单独的线程时,程序才会泄漏,但我无法推断原因。
如果我正确理解您的代码,那么两个版本都有未定义的行为,因为您有两个线程同时访问对象token
,其中一个线程正在写入它,而另一个线程正在读取它。我不确定在 2 秒后尝试关闭token
的确切目的应该是什么;但不管是什么,你都必须使用适当的同步,例如,使用std::mutex
来保护对token
的访问,或者至少使token
原子的。然后程序将继续泄漏,因为这仅取决于某人连接的时间是否超过 2 秒(我认为这就是这里发生的事情),但至少泄漏将是明确定义的行为......
相关文章:
- 将字符串存储在c++中的稳定内存中
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 可组合的lambda/std::函数与std::可选
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 函数指针和 lambda 的内存管理
- C++ lambda 函数会导致内存泄漏
- C++ Lambda 的内存布局
- 将函数移动到线程(使用 lambda)时内存泄漏
- Qt5 新信号到 lambda 连接内存泄漏
- C++Lambda函数关闭-内存问题
- 将shared_ptr传递给lambda时的C++内存管理
- 局部变量的内存地址根据 lambda 参数的预感而变化
- C++11 中 Lambda 的内存管理
- 堆栈内存中的c++ lambda
- clang++生成的可执行文件会泄漏内存,关于std::function和lambda
- Lambda捕获和内存管理