将函数移至线程时发生内存泄漏(使用lambda)

时间:2019-03-22 01:05:28

标签: c++ multithreading memory-leaks

我有下面的代码,它使用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();

我知道该程序仅在将用于运行服务器的代码移至单独的线程时才泄漏,但我无法对此原因进行推理。

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的代码,则这两个版本都具有未定义的行为,因为您有两个线程同时访问对象token,其中一个正在写入对象,而另一个正在读取对象。我不确定2秒钟后尝试关闭token的确切目的是什么;但是无论如何,您都必须使用适当的同步,例如使用std::mutex保护对token的访问,或者至少使token atomic。然后,程序将继续泄漏,因为这仅取决于是否有人花费了超过2秒的时间(我想这就是这里发生的事情)进行连接,但至少泄漏是明确定义的行为……