2013-06-20 51 views
3
傳遞參數

我的應用程序有一個類似於下面的代碼升壓線程 - 通過參考

void SomeClass::OtherMethod(std::vector<std::string>& g) 
{ 
    g.pushback("Something"); 
} 

void SomeClass::SomeMethod() 
{ 
    std::vector<std::string> v; 
    boost::thread t(boost::bind(&SomeClass::OtherMethod,this,v) 
    t.join(); 
    std::cout << v[0]; //Why is this empty when the vector created on stack 
} 

我想知道爲什麼在棧上創建矢量時,矢量V是空的一個部分,它的工作原理是當在堆上創建。我希望上面的代碼能夠工作,因爲即使在堆棧上創建矢量,矢量仍然在範圍內。

回答

10

Bind複製其參數。使用boost::ref

boost::thread t(boost::bind(&SomeClass::OtherMethod,this, boost::ref(v)) 
+0

感謝您的回覆。但我仍然沒有得到它。如果綁定複製它的參數,那麼這是如何產生影響的。對不起,我很困惑 – MistyD

+0

@MistyD現在它複製一個'reference_wrapper',它通過引用接受它的參數(即你的向量),並提供隱式的'T&'類型轉換運算符。 –

+0

我明白'boost :: ref'會做到這一點。我只是好奇它爲什麼沒有它就無法正常工作。你聲明,如果不使用boost :: ref,它會複製一份。我只是好奇,即使它做了副本爲什麼不起作用? – MistyD

0

默認線程通過值採用的參數,即使函數本身期望的參考。使用boost :: ref()強制通過引用傳遞參數。

()由默認參數被複制到內部存儲器,在那裏 它們可以通過執行的新創建的線程被訪問,即使 在函數中相應的參數被期待的參考。

A. Williams,「行爲中的併發」,2.2將參數傳遞給線程函數。