В .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
Работает только если функция вне класса и без параметров
Хочу чтобы поток ожидал пока поступят данные в очередь. Может быть тогда есть иной способ с использованием данных класса без 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 использование [=] или [&] ничем не грозит.
Комментариев нет:
Отправить комментарий