簡體   English   中英

C ++程序潛在的內存泄漏

[英]c++ program potential memory leak

我每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();
    }
}

將引用傳遞給線程是一個很大的禁忌。 或至少有一個錯誤等待發生...

您應該嘗試重新定義do任務以按值接受std :: vector。 那不是通過調用std :: move將它們傳遞給線程來嘗試做的事情嗎?

將do_task的定義更改為:

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

我做了一些快速的計算。 如果由function()啟動的線程泄漏,則每40ms啟動4個線程,則泄漏率應超過1.4MB /小時。 如果泄漏小於此值,則應開始在代碼中查找其他位置。

無論如何,每秒啟動100個線程並不是很有效。 創建線程會損失大量計算能力。 您是否考慮過其他選擇?

讓4個線程運行無窮循環,並將工作排隊,將更加高效,減少操作系統負擔,並減少不易控制的泄漏。

我認為openmp可能很有趣。 OpenMP是用於開發並行應用程序的API。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM