Страницы

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

вторник, 29 января 2019 г.

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

В .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?


Ответ

Во-первых, всегда можно использовать метод 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 использование [=] или [&] ничем не грозит.

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

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