将函数移动到线程(使用 lambda)时内存泄漏

Memory leak when move function to thread (using lambda)

本文关键字:lambda 内存 泄漏 使用 函数 移动 线程      更新时间:2023-10-16

我有下面的代码,它使用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 秒(我认为这就是这里发生的事情),但至少泄漏将是明确定义的行为......