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

标签 c++11 concurrency lambda synchronization condition-variable

我正在尝试使用 c++11 并发创建生产者-消费者方法。 condition_variable 类的 wait 方法有一个谓词作为第二个参数,所以我想到了使用 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;
    }
};

但我收到此错误:

[Error] capture of non-variable 'LimitedBuffer::count'

我不太了解 c++11 和 lambda 函数,所以我发现 class members can't be captured by value .虽然按值(value)来说,我是通过引用来捕捉它们的,但它似乎是一回事。

为了展示我的才华,我将结构成员的值存储在局部变量中,并在 lambda 函数中使用它们,它成功了! ...与否:

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

显然,我通过使用局部变量破坏了 wait 函数的全部意义,因为该值被分配一次,而有趣的部分是检查可能、应该和将会改变的成员变量。傻我。

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

我真的不明白为什么我不能在 lambda 函数中使用成员变量,但是既然宇宙大师这样为 c++11 设计了 ​​lambda 函数,那肯定有一些很好的理由。

最佳答案

count 是一个成员变量。不能直接捕获成员变量。相反,您可以捕获 this 以达到相同的效果:

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

关于c++11 - 尝试使用 lambda 函数作为 condition_variable 等待方法的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24345272/

相关文章:

java - Activity 和 Fragment 并发

java - 使 AtomicXXX 对象变得 volatile

java - 按子列表中项目的值过滤列表

c++ - C++ Goto vs Std::function lambda? [closed]

c++ - 在 for 循环中使用 lambda 函数连接信号槽

c++ - gcc shared_ptr复制赋值实现

c++ - 如何以更好的性能传递和共享 shared_ptr 所有权?

在后台线程上具有固定增量时间的 C++ 循环

concurrency - 实验弱有序并发的工具

c++ - 这个带有空捕获列表的 lambda 如何能够引用到达范围名称?