![](/img/trans.png)
[英]boost::thread_resource_error when more than 32705 threads
[英]boost::thread runtime error when generating threads
我有一個項目,我們希望提供該項目來使用線程來加速所有操作。 我們希望能夠在各個線程中調用此函數:
Request& Filter::processRequest(Request& req)
因此,我將函數打包在lambda表達式中以訪問返回值。
我現在收到以下運行時錯誤:
glibc detected ... double free or corruption (!prev): ...
當我取消注釋行時,將線程添加到組中,一切正常。
boost::thread_group thread;
for (std::set<boost::shared_ptr<Filter> >::iterator i = sources_.begin();
i != sources_.end(); ++i) {
Request ret
thread.add_thread(new boost::thread(boost::lambda::var(ret) =
(*i)->processRequest(req)));
req+=ret;
...
}
thread.join_all();
可能是此運行時錯誤的原因。 還是有另一種方法可以將此函數放在各個線程中?
如果這種技術完全奏效,那么您將需要穩定引用的多個ret值(每個執行線程一個)。 您必須等到線程連接完成后才能使用這些值。
您可以嘗試做的一個簡單修改就是在vector<Request> retValues
循環之外制作一個矢量,然后每次add_thread
都向該矢量中添加一個元素,並傳遞對該元素的引用。 然后,如果您等到聯接之后才使用這些值,也許會起作用?
boost::thread_group thread;
vector<Request> retValues;
for (std::set<boost::shared_ptr<Filter> >::iterator i = sources_.begin();
i != sources_.end(); ++i) {
retValues.push_back(0);
thread.add_thread(new boost::thread(
boost::lambda::var(retValues.back()) =
(*i)->processRequest(req)));
...
}
thread.join_all();
// retValues safe to use here...
(注意:可能沒有必要使用boost::lambda
;您可以使用boost :: bind連接到存儲結果的輔助類:
...但是,實際上,無論您需要每個線程一個單獨的變量來存儲結果...其壽命可以持續很長時間,以便線程能夠對其進行寫入。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.