簡體   English   中英

生成線程時boost :: thread運行時錯誤

[英]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連接到存儲結果的輔助類:

從boost :: threaded成員函數獲取返回值?

...但是,實際上,無論您需要每個線程一個單獨的變量來存儲結果...其壽命可以持續很長時間,以便線程能夠對其進行寫入。)

暫無
暫無

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

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