Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Как использовать в std::condition_variable функцию член класса?

#многопоточность #cpp11


В .h

class A{
    std::thread thread;
    std::mutex  mutex;
    std::condition_variable cv;
    bool run;
    std::queue< ResourceData > queue;
public:
    bool resource_empty( void ){return !this->queue.empty();}
...


В реализации

while( this->run ){
    std::unique_lock lk(this->mutex);
    cv.wait( lk, /* Сюда нужно вставить указатель на функцию */
    this->resource_empty );
    // просто this->queue.empty не работает
    // cv.wait( lk, []{ return !this->queue.empty();} ); и так
}


Работает только если функция вне класса и без параметров.

Хочу чтобы поток ожидал пока поступят данные в очередь. Может быть тогда есть иной
способ с использованием данных класса без std::condition_variable?
    


Ответы

Ответ 1



Во-первых, всегда можно использовать метод wait без второго параметра. Во-вторых, чтобы использовать внешнюю переменную в замыкании - ее надо сначала захватить: cv.wait( lk, [this] { return !this->queue.empty(); } ); Писать this-> необязательно - в лямбде так же, как и в любом другом месте, можно обращаться к членам this просто по имени. Но захватывать this нужно все равно: cv.wait( lk, [this] { return !queue.empty(); } ); Также существует универсальный способ - захват всех необходимых переменных по значению: cv.wait( lk, [=] { return !queue.empty(); } ); или по ссылке: cv.wait( lk, [&] { return !queue.empty(); } ); Пользоваться этими способами надо с осторожностью: бесконтрольный захват переменных может привести к утечкам памяти или повреждению памяти. Но применительно к cv.wait использование [=] или [&] ничем не грозит.

Комментариев нет:

Отправить комментарий