2011-11-28 51 views
8

我一直在尋找的C++ 0x線程,並有這樣的代碼:線程函數啓動緩慢

#include <vector> 
#include <iostream> 
#include <thread> 
void TestFunc(const vector<int>& vVec) 
{ 
    cout << "in"<<endl; 
} 

int main() 
{ 

    int sizer = 400000000; 

    vector<int> vTest(sizer); 
    for(int f=0; f<sizer; f++) 
     vTest[f] = f; 


    cout << "V created." << endl; 

    thread one(TestFunc, vTest); 

    one.join();  

} 

正如你可以看到它只是傳遞一個向量的線程。 我不明白的是在出現「V created」消息後出現暫停。最初這(我假設)是被複制用於該函數的向量。 爲了制止這一點,我通過引用傳遞,但這沒有什麼區別。

延遲似乎是正比於這表明它仍復制(或做一些與陣列)的向量的大小。 如果我嘗試沒有線程的同一個實驗,只是直接調用函數,那麼當傳遞值的時候會有延遲,但是當我按照預期通過引用傳遞的時候不會。

我嘗試使用Boost線程而不是C++ 0x中相同(雖然我讀過他們很多是相同的),得到了相同的結果。

是有一些原因的行爲或有我錯過了什麼言自明? 謝謝。

不好意思,貼錯了測試代碼。糾正。 編輯:添加包括按要求。

編譯時: 克++ 44 -std =的C++ 0x -lpthread tester.cpp -o測試 ...正如我GNU 4.4沿側安裝附帶我的Linux標準的GNU編譯器(CentOS的),它不支持C++ 11。

+0

TestFunc的最昂貴的部分是走線,而不是參數傳遞。似乎C++ 0x不支持創建線程 – BruceAdi

+0

@Mahesh:在什麼系統上?這隻有4億美元,並且會很適合32位整數。 –

+0

@BruceAdi:在C++中,11個線程是由標準強制的,並且至少gcc-4.6支持它們,並且它們工作 - 我每天都在使用它們。 – hirschhornsalz

回答

17

我只是猜測,因爲你還沒有發佈使用線程的代碼的版本,但我懷疑你的問題是,默認情況下,std::bind(或boost::bind)複製您綁定的所有參數。爲了避免這種情況,您可以使用std::refstd::cref

爲了使這個具體的,你可能會使用bind這樣的:

std::bind(TestFunc, vTest) 

相反,你應該使用這樣的:

std::bind(TestFunc, std::cref(vTest)); 
+0

這對我來說似乎有點笨拙。有沒有辦法''綁定'神聖的功能需要一個引用,以便它應該存儲引用? – Omnifarious

+0

+1我剛剛用你的代碼測試過,你是對的。當使用_std :: cref_時,延遲消失。很好的發現。 – hirschhornsalz

+7

@Omnifarious:我不確定這甚至會是可取的。從閉包(本質上,就是'bind')所期望的行爲是,只要閉包存在,作爲參數傳入的對象就會「存活」。如果僅爲參考類型的所有參數「綁定」存儲的引用,情況就不會如此。或者,以另一種方式來看待它:複製所有參數是一種安全的默認行爲。通過引用會帶來一定的危險,因此應該明確要求;此外,明確的'ref'或'cref'是任何後續維護人員的明確標誌。 –

-1

哪裏線程在這裏?看起來像for循環導致您所指的延遲。沒有什麼不尋常這裏 - 因爲你指定大小的矢量200000000

+3

-1:如果延遲不在看到「V創建」之間,這將是一個很好的答案。和'in'。 – Omnifarious