2013-07-25 44 views
2
void ThreadFn(int& i) 
{ 
    cout<<"Hi from thread "<<i<<endl; 
} 
int x = 0; 
void CreateThreads(vector<thread>& workers) 
{ 
    for(int i = 0; i< 10; i++) 
    { 
     workers.push_back(thread(&ThreadFn, x)); 
    } 
} 

我期待一個編譯錯誤在線程創建(workers.push_back(thread(&ThreadFn, x));)因爲x應由REF進行傳遞。 不過,我覺得正確的語法應該已經:通過引用傳遞到std ::螺紋的C++ 0x在VS2012

workers.push_back(thread(&ThreadFn, std::ref(x))); 

當然,代碼編譯罰款,也表現正常。我正在使用VC11。任何想法爲什麼這不被標記?

回答

3

這是一個VC11的bug,在thread對象進行的爭論內部副本(因爲它應該),但是它不將它們正確地轉發到ThreadFn功能,所以會發生什麼是參考綁定到thread對象的內部int成員。

曾經有過類似的錯誤,因爲我們使用std::bind實現它,但是我換成不同的實現細節,通過價值轉發捕捉函數的自變量使用std::bind GCC的std::thread