2017-08-07 44 views
-2

我在我的代码中有一个函数,它不是主函数并使用线程。程序运行时称为数千次。它看起来像这样当一个C++ 11函数加入它的线程仍然没有终止时,它会返回吗?

void my_function(vector<string> input, vector<string> &results) 
{ 
    results.clear(); 
    results.resize(input.size()); 
    vector<thread> th; 

    th.resize(input.size()); 


    for(int i=0; i<input.size();i++) 
    { 
     th[i]=thread(fold, input,ref(results), i); 
    } 

    for(auto & t : th) 
    { 
     t.join(); 
    } 
}  

fold函数将一个字符串,从入门的inputi衍生到output的进入我。我想确保何时my_function返回所有线程都被终止。我问这个问题的原因是,在对这个函数进行并行处理之后,我得到了巨大的内存泄漏,并且怀疑线程保留了这些资源。

+2

是的所有线程函数都必须返回'join'调用返回。所有'join'调用都必须在'my_function'返回之前返回。与'std :: thread'对象关联的所有资源都将在相应的'join'调用或者对象被破坏时释放(这是从'my_function'返回的一部分完成的)。 ***但是,如果线程函数明确地分配了它不释放的资源,那么这些资源将不会自动清理。 –

+0

@Reza也应该保护'结果'免受并行访问。为了避免这个问题,你也应该对结果进行调整大小,并且每个线程都应该知道它的编号,所以它会修改为它分配的变量,假设每个线程都产生一个结果字符串 – Arkady

+0

MCVE。 fold做什么? – SergeyA

回答

0

你的函数看起来不适合并行化。您正在为每个线程提供一个引用包装器,该引用包装器已被初始清除。如果函数fold完全调整/重新分配results,则一个线程将重新分配数据并在新分配的空间中工作,而其他线程正试图访问旧的已删除空间。另一种可能性是多线程试图同时调整矢量大小,导致多次重新分配和泄漏。

一般来说,让多个线程同时自由更改相同的数据是一个坏主意,因为你不知道会发生什么。让线程在向量中更改自己的元素而不重新排序,添加或删除元素是很好的。但是在那一点上,你应该给线程引用它们修改的单个字符串,而不是包含它们的向量。

+0

更正了,对不起。 – Reza

+0

可以理解,多线程很难。 – jwilson

相关问题