2011-03-01 89 views
5

您好我有一個Boost線程應該返回一個雙。功能如下:Boost線程返回雙重

void analyser::findup(const double startwl, const double max, double &myret){ 
    this->data.begin(); 
    for(int i = (int)data.size() ; i >= 0;i--){ 
    if(this->data[i].lambda > startwl){ 
     if(this->data[i].db >= (max-30)) { 
     myret = this->data[i+1].lambda; 
     std::cout <<"in thread " << myret << std::endl; 
     return; 
     } 
    } 
    } 
} 

這個功能是由另一個函數調用:

void analyser::start_find_up(const double startwl, const double max){ 
    double tmp = -42.0; 
    boost::thread up(&analyser::findup,*this, startwl,max,tmp); 
    std::cout << "before join " << tmp << std::endl; 
    up.join(); 
    std::cout << "after join " << tmp << std::endl; 
} 

反正我已經試過和GOOGLE了幾乎所有的東西,但我不能讓它返回一個值。

輸出現在看起來像這樣。

before join -42 
in thread 843.487 
after join -42 

感謝您的任何幫助。

回答

6

tmp由於創建boost :: thread對象會將所有參數複製到線程存儲(see documentation),所以在線程連接後沒有得到預期值。

必須封裝tmpboost::ref,其中有提供「拷貝構造參考」的影響(如果該術語是不夠的遺憾,但是這是想法)

double tmp = -42.0; 
boost::thread up(&analyser::findup,*this, startwl,max, boost::ref(tmp)); 

更多關於Thread Management documentation

+1

具體的事情要注意的是參數*複製*。在文檔中查看[構造器註釋](http://www.boost.org/doc/libs/1_46_0/doc/html/thread/thread_management.html#thread.thread_management.thread.multiple_argument_constructor)。 – chrisaycock 2011-03-01 15:15:36

+0

我已經批准了您的待處理編輯,因此我無法對該問題進行自己的編輯。你能否再次修改這個問題,以便標籤是* boost *和* C++ *?目前的標籤是沒有意義的。 – chrisaycock 2011-03-01 15:17:10

+0

@chrisaycock完成。感謝您的解釋! – CharlesB 2011-03-01 15:18:56