Data_condition等待无效参数错误

data_condition wait invalid argument error

本文关键字:参数 错误 无效 等待 condition Data      更新时间:2023-10-16
data_cond.wait(lk, [this]{return !data_queue.empty();});
用 编译后的

无效参数

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

源自book is

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

这看起来很像我的书中的代码:c++并发操作,特别是缺少[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的lambda上给出"无效类型参数"错误,但在X::foo中很高兴接受相同的代码。

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

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

除非data_queue是当前类实例的非静态数据成员,并且您是从非静态类方法调用这行代码,否则没有必要尝试捕获this指针。如果您试图在函数内部调用代码,该函数是独立的独立函数或静态类方法,则不会捕获任何this指针,并且您将以无效参数错误告终。你所引用的书使用无状态lambda(即括号内没有捕获的变量)这一事实对我来说意味着你正在尝试执行一个操作,这要么是不必要的,要么是不可能的,这取决于代码的上下文。