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();});
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();});
看起來很像我的書中的代碼: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);
}
這完全來自你的書 –
除非data_queue
是當前類實例的非靜態數據成員,並且您從非靜態類方法調用此行代碼,則不需要嘗試捕獲指針this
。如果您試圖在獨立的獨立函數或靜態類方法的函數內調用您的代碼,那麼將不會有任何指針捕獲,並且您將結束無效的參數錯誤。您所引用的書使用無狀態lambda(即方括號內沒有捕獲變量)的事實意味着您正在嘗試執行根據代碼上下文而不必要或不可能執行的操作。
不管有沒有這個,還有一個錯誤,代碼中哪裏出錯? –
對不起,如果這不是原因,那麼你將不得不顯示更多的代碼和錯誤。我無法讀懂。 – Jason
你能告訴我們錯誤嗎,至少? – birryree