尝试使用lambda函数作为condition_variable等待方法的谓词

dab*_*aba 2 concurrency lambda synchronization condition-variable c++11

我试图使用c ++ 11并发制作生产者 - 消费者方法.类的wait方法condition_variable有一个谓词作为第二个参数,所以我想到使用lambda函数:

struct LimitedBuffer {
    int* buffer, size, front, back, count;
    std::mutex lock;
    std::condition_variable not_full;
    std::condition_variable not_empty;

    LimitedBuffer(int size) : size(size), front(0), back(0), count(0) {
        buffer = new int[size];
    }   

    ~LimitedBuffer() {
        delete[] buffer;
    }

    void add(int data) {
        std::unique_lock<std::mutex> l(lock);

        not_full.wait(l, [&count, &size]() {
            return count != size;
        });

        buffer[back] = data;
        back = (back+1)%size;
        ++count;

        not_empty.notify_one();
    }

    int extract() {
        std::unique_lock<std::mutex> l(lock);

        not_empty.wait(l, [&count]() {
            return count != 0;
        });

        int result = buffer[front];
        front = (front+1)%size;
        --count;

        not_full.notify_one();

        return result;
    }
};
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误:

[Error] capture of non-variable 'LimitedBuffer::count'
Run Code Online (Sandbox Code Playgroud)

我对c ++ 11和lambda函数并不是很了解,所以我发现类成员不能被值捕获.虽然价值,我通过引用捕获它们,但它似乎是相同的事情.

在辉煌的显示中,我将struct成员值存储在局部变量中并在lambda函数中使用它们,并且它有效!... 或不:

int ct = count, sz = size;
not_full.wait(l, [&ct, &sz]() {
    return ct != sz;
});
Run Code Online (Sandbox Code Playgroud)

显然我wait通过使用局部变量来破坏函数的整个点,因为值被赋值一次,而有趣的部分是检查可能,应该和将要改变的成员变量.傻我.

那么,我的选择是什么?有什么方法可以wait使用成员变量使方法做它必须做的事情?或者我被迫不使用lambda函数,所以我必须声明辅助函数来完成工作?

我真的不明白为什么我不能在lambda函数中使用成员变量,但是由于Universe的主人以这种方式为c ++ 11赋予了lamba函数,所以必须有一些很好的理由.

nos*_*sid 8

count是一个成员变量.无法直接捕获成员变量.相反,您可以捕获this以实现相同的效果:

not_full.wait(l, [this] { return count != size; });
Run Code Online (Sandbox Code Playgroud)