Я последовал советам из этого обсуждения и написал оболочку для подписчика, которая будет использоваться в многопоточном приложении. Он должен отправить последнее полученное сообщение и ждать получения нового сообщения. Все это должно произойти после получения первых n (10 здесь) сообщений. В следующем коде есть тупик. wait()
для переменной условия не снимает блокировку. Я не могу понять, в чем проблема.
class NewSub
{
public:
NewSub(ros::NodeHandle* node_handle, std::string topic)
: node_handle(node_handle), topic_(topic)
{
sub = node_handle->subscribe(topic, 1, &NewSub::latest_data, this);
}
auto get_latest()
{
if(counter > 10) {
boost::unique_lock<boost::mutex> lock(mutex_);
auto condition = [this]{std::cout << "Checking predicate..." << std::endl;
return this->data_received;};
cond.wait(lock, condition);
data_received = false;
}
return data;
}
private:
ros::NodeHandle* node_handle;
ros::Subscriber sub;
std_msgs::Int32 data;
boost::condition_variable cond;
boost::mutex mutex;
bool data_received = false;
int counter=0;
std::string topic_;
void latest_data(const std_msgs::Int32& msg)
{
{
boost::lock_guard<boost::mutex> lock(mutex_);
data = msg;
datareceived_ = true;
counter++;
}
cond_var_.notify_one();
}
};
Буду признателен, если кто-нибудь укажет, в чем заключается ошибка. Спасибо.