【问题标题】:c++ program potential memory leakc++程序潜在内存泄漏
【发布时间】:2017-08-13 03:15:53
【问题描述】:

我每 40 毫秒调用一次以下void function() 函数,我发现内存消耗稳步增加。一开始消耗不明显,但几天后消耗巨大。任何人都可以帮助解释这段代码有什么问题。是线程问题还是std::move问题导致了内存泄漏。

void do_task(const std::vector<int>& tmp)
{
    // do some work here
}

void function()
{
    std::vector<std::thread> task;
    std::vector<int> tmp1, tmp2;

    GetTempValue(tmp1);
    GetTempValue(tmp2);

    task.push_back(std::thread(do_task, std::move(tmp1)));
    task.push_back(std::thread(do_task, std::move(tmp2)));

    tmp1.clear();
    tmp2.clear();

    UpdateTempValue(tmp1);
    UpdateTempValue(tmp2);

    task.push_back(std::thread(do_task, std::move(tmp1)));
    task.push_back(std::thread(do_task, std::move(tmp2)));

    tmp1.clear();
    tmp2.clear();

    for(int i=0; i<task.size(); i++)
    {
        task[i].join();
    }
}

【问题讨论】:

  • 我不认为你是通过 Valgrind 发送的?无论如何,如果移动语义正在发挥作用,那么这些清除是毫无意义的。出于好奇,请使用您的平台工具链信息更新您的问题,最好是mcve。
  • @rxu。上面的代码不能存在数据竞争问题。向量 tmp1 和 tmp2 处理得非常正确。除了对 clear() 的调用是多余的。
  • 抱歉打扰了:)
  • 我会更仔细地研究 do_task()。这里使用的操作系统和编译器是什么?
  • 等一下!!! do_task 不应该接收 std::vector,而不是引用吗?

标签: c++ multithreading memory-leaks std


【解决方案1】:

传递对线程的引用是一个很大的禁忌。或者至少是一个等待发生的错误......

您应该尝试重新定义 do 任务以按值接受 std::vector。无论如何,这不是您试图通过调用 std::move 将它们传递给线程来做的吗?

将do_task的定义改为:

void do_task(std::vector<int> tmp);

我做了一些快速的计算。如果由 function() 启动的线程泄漏,通过每 40 毫秒启动 4 个线程,您应该有超过 1.4MB/小时的泄漏率。如果您的泄漏小于此值,您应该开始在您的代码中寻找其他地方。

无论如何,每秒启动 100 个线程并不是很有效。创建线程时会损失很大一部分计算能力。您是否考虑过其他选择?

让 4 个线程运行无限循环,并将工作排队给它们会更高效,对操作系统的负担更少,并且更不容易出现您无法控制的泄漏。

【讨论】:

  • 这是有道理的。我每 40 毫秒启动 6 个线程,do_task 是一个光学字符识别功能。那么为什么会泄露呢?
  • 识别部分可能泄漏你使用tesseract吗?
  • @Hakes ocr 程序没有泄漏,传递给 do_task 的向量只是一个类似目的的查找表。
  • @MichaëlRoy 您能否详细说明导致此泄漏问题的原因。我会采纳这个作为答案。我们这里有的是如何解决它。
  • 通过引用将参数传递给线程是可以的;见this answer。
【解决方案2】:

我认为 openmp 可能很有趣。 OpenMP 是一种用于开发并行应用程序的 API。

https://en.m.wikipedia.org/wiki/OpenMP

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多