首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将函数移动到线程时内存泄漏(使用lambda)

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

Stack Overflow用户
提问于 2019-03-22 01:05:28
回答 1查看 278关注 0票数 0

下面有代码,它使用uWebSockets作为后端的库。现在我想正确地关闭它,它会导致内存泄漏(使用val研检查)。

代码语言:javascript
运行
复制
#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);
    };

    ...
}

...如下:

泄露版本:

代码语言:javascript
运行
复制
std::thread(start_server).detach();
start_timer();

无泄漏版本:

代码语言:javascript
运行
复制
std::thread(start_timer).detach();
start_server();

我知道只有当我将运行服务器的代码移到单独的线程时,程序才会泄漏,但我无法解释原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-22 01:36:32

如果我正确理解您的代码,那么两个版本都有未定义的行为,因为您有两个线程同时访问对象token,其中一个线程正在写入对象,另一个线程正在从中读取。我不知道在精确2秒之后试图关闭token的确切目的是什么;但是不管它是什么,您都必须使用适当的同步,例如使用std::mutex来保护对token的访问,或者至少使token 原子性。程序将继续泄漏,因为这只取决于某人连接所需的时间是否超过2秒(我猜想这就是这里所发生的),但至少泄漏将是定义良好的行为…。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55291444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档