data_condition等待无效参数错误

时间:2011-10-15 03:18:24

标签: c++ concurrency

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

使用

编译后的无效参数
g++ -std=c++0x -Wall -pthread threadpool.cc -o hello 

最初来自书籍

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

2 个答案:

答案 0 :(得分:2)

这看起来很像我的书中的代码:C++ Concurrency in Action,尤其是缺少[this]捕获(在最终打印中将修复的错字)。

不幸的是,g ++ 4.5和4.6中存在一个错误,编译器无法在类模板中处理带有[this]捕获的lambda。这甚至适用于简单的模板。您可以通过以下简单类看到问题:

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中的lambda上给出“无效类型参数”错误,但很高兴接受X::foo中的相同代码。

希望这将在未来的g ++版本中修复。同时,我建议在wait电话周围使用明确的:

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

答案 1 :(得分:0)

除非data_queue是当前类实例的非静态数据成员,并且您从非静态类方法调用此行代码,否则无需尝试捕获{{ 1}}指针。如果您试图在一个独立的独立函数或静态类方法的函数内部调用代码,那么就不会有任何this指针要捕获,并且您将要结束了无效的参数错误。您引用的书使用无状态lambda(即括号内没有捕获的变量)这一事实意味着您试图执行一个不必要的操作,或者根据代码的上下文不可能执行。