2011-10-15 48 views
0
data_cond.wait(lk, [this]{return !data_queue.empty();}); 

無效的參數與data_condition等待無效的參數錯誤

g++ -std=c++0x -Wall -pthread threadpool.cc -o hello 
從書

原來編譯後

data_cond.wait(lk, []{return !data_queue.empty();}); 
+2

你能告訴我們錯誤嗎,至少? – birryree

回答

2

看起來很像我的書中的代碼:C++ Concurrency in Action,特別是缺少[this]捕獲(在最終打印中將會修復的拼寫錯誤)。

不幸的是,g ++ 4.5和4.6中存在一個bug,其中編譯器無法在類模板中處理帶有[this]捕獲的lambdas。這甚至適用於簡單的模板。您可以通過下面的簡單類看這個問題:

struct X 
{ 
    int i; 
    void foo() { 
     [this] { ++i; }; 
    } 
}; 

template<typename T> 
struct Y 
{ 
    T i; 
    void foo() { 
     [this] { ++i; }; 
    } 
}; 

兩個G ++ 4.5和g ++ 4.6會給在Y::foo拉姆達「無效的類型參數」的錯誤,而是愉快地接受X::foo相同的代碼。

希望這將在未來版本的g ++中得到修復。同時,我建議在wait附近使用明確的電話:

while(data_queue.empty()) 
{ 
    data_cond.wait(lk); 
} 
+0

這完全來自你的書 –

0

除非data_queue是當前類實例的非靜態數據成員,並且您從非靜態類方法調用此行代碼,則不需要嘗試捕獲指針this。如果您試圖在獨立的獨立函數或靜態類方法的函數內調用您的代碼,那麼將不會有任何指針捕獲,並且您將結束無效的參數錯誤。您所引用的書使用無狀態lambda(即方括號內沒有捕獲變量)的事實意味着您正在嘗試執行根據代碼上下文而不必要或不可能執行的操作。

+0

不管有沒有這個,還有一個錯誤,代碼中哪裏出錯? –

+0

對不起,如果這不是原因,那麼你將不得不顯示更多的代碼和錯誤。我無法讀懂。 – Jason