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