ожидание переменной условия, ошибка: «некоторая переменная» не фиксируется. Должна ли это быть глобальная переменная, любой обходной путь? - PullRequest
0 голосов
/ 16 апреля 2020

Я получил ошибку

pcg is not captured.
error: could not convert ‘__p.my function name()::<lambda()>()’ from ‘void’ to ‘bool’
  while (!__p())

      ~~~^~

Ошибка появляется из этой строки

 pcg->cv_post_start.wait(lk, [] {return pcg->consumer_start;});

Так как у меня есть несколько provider_consumer_group, у каждого есть своя собственная

std::mutex mtx;
std::condition_variable cv_consumer_start;
bool consumer_start;

can ' если просто поставить один в глобальную позицию, есть ли способ, которым я все еще могу использовать pcg-> consumer_start, чтобы уведомить потребителя о запуске? Сейчас pcg-> cv_post_start.wait не принимает это. Спасибо.

Код приведен ниже. (Только для разъяснения этой проблемы скопируйте основные c части, а не весь код), * ​​1012 *

#include <iostream>


typedef struct{
    int id;
    std::mutex mtx;
    std::condition_variable cv_consumer_start;
    bool consumer_start;
    //some other parameters
}provider_consumer_group;


std::map<int, provider_consumer_group> id_group_map;


int thread_provider(int id){

    provider_consumer_group *pcg = &id_group_map[id];


    //do something

    lock_guard<std::mutex> lk(pcg->mtx);
    pcg->consumer_start = true;
    pcg->cv_consumer_start.notify_one()

    return 0;
}

int thread_consumer(int id){

    provider_consumer_group *pcg = &id_group_map[id];

    unique_lock<std::mutex> lk(pcg->mtx);
    pcg->cv_post_start.wait(lk, [] {return pcg->consumer_start;});        
    lk.unlock();

    //do something

    return 0;
}

int main(){


    for(int i=0;i<10;i++){
        provider_consumer_group *pcg = &id_group_map[i];
        pcg->consumer_start = false;
    }

    int id = 10;

    std::thread t1(thread_provider, id);
    std::thread t2(thread_consumer, id);

    t1.join();
    t2.join();

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...