2016-03-03 38 views
1

我有我傳遞到一個線程像這樣的圖形對象:飼養參考活着後,被傳遞到線程

void MyClass::execute_subqueries(Graph& g, vector<query>&& queries) { 
    for (size_t i = 0; i < queries.size(); i++) { 
    threads.emplace_back(thread(my_thread, ref(g), queries[i])); 
    } 
} 

我想使圖形對象g的副本,因爲我將修改這是因爲我的線程正在運行。我只想創建一個副本,並將引用傳遞給我在for循環中啓動的所有線程。我不想爲每個線程創建一個副本,因爲Graph很大,克隆它很昂貴。

問題是,我無法弄清楚如何保持我的圖形對象活着。我想在我傳入參考後,Graph對象被取消分配,我的線程不會產生我期望的結果。什麼是這樣做的好方法?

+1

'ref()'避免複製圖形。你的第二個變種(愚蠢的,因爲它可能是使用全球)應該雖然工作,雖然不完整的代碼使得無法確定。建議:使用'shared_ptr'。 –

+1

也許你應該解釋*爲什麼*你想製作一個對象的副本?您嘗試解決的*實際*和*原始*問題是什麼?請[閱讀關於XY問題](http://xyproblem.info/),你的問題是一個很好的例子。 –

+0

@UlrichEckhardt哦,你說得對。它確實有用!哎呀,我這樣做,我認爲和我上面的例子一樣,但事實並非如此。我會編輯我的問題,以尋求一種好的方法來做到這一點。 – Duncan

回答

0

它可以使用的shared_ptr在其他答案建議,但它確實取決於什麼做你的程序正在做。 for循環之前可以嘗試:

std::shared<Graph> gPtr(new Graph(g)); 
//std::shared<Graph> gPtr(g.clone()); // guess, you mentioned cloning 

然後啓動線程。命名可以更好。我假設my_thread不是一個真正的線程實例,而是一個函數(否則它不會編譯)。讓它走,而不是引用一個shared_ptr等

你大概就是這個意思 - 如果線程是的std ::向量(猜測):

threads.push_back(std::thread(my_thread_fct, gPtr, queries[i])); 

threads.emplace_back(my_thread_fct, gPtr, queries[i]); 

@JoachimPileborg是正確的 - 需要更多的上下文/代碼來理解正在發生的事情。這一切的輸出是什麼?你會從處理過的克隆圖中提取某些東西嗎?根據這些設計決定,代碼看起來會非常不同...

1

你的標誌告訴我,你用C++ 11,那麼你爲什麼不使用

std::vector< std::shared_ptr<Graph> > graphs; 

,並通過共享指針指向線程?他們會保持你的圖表活着,只要他們使用和照顧後清理...

1

既然你想要複製一個圖表,你可以把它放在std::shared_ptr,並通過它到每個線程(請注意,您將傳遞相同指針的副本,因此每個線程不會有副本)。

考慮是這樣的:(注意,這需要C++ 11的設置)

// A vector of pointers to Graph 
vector<shared_ptr<Graph>> graphs; 

... 

// Make a shared allocated copy. 
graphs.emplace_back(std::make_shared<Graph>(g));