Я получил ошибку
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;
}