我对boost条件有问题,我在cpp类中有这两个实例变量:
boost::condition wait_answer_condition;
boost::mutex wait_answer_mutex;
然后我有一个发送消息的方法,条件为:
方法1
boost::unique_lock<boost::mutex> lock(wait_answer_mutex)
//do some work and send message
//wait the result
wait_answer_condition.wait(lk);
//get the result
result = responseIdSyncMap[currentRequestID];
然后我有另一种方法接收结果并唤醒发送者线程
方法2
int requestID = responseData->getInt32Value("response_id");
responseIdSyncMap.insert(make_pair(requestID, responseData));
wait_answer_condition.notify_one();
这两个方法在不同的线程中调用。问题是当调用method2时,wait_answer_condition在调用“wait_answer_condition.notify_one()”之前释放,并且方法1被唤醒而没有找到结果。
有人对此有所了解吗?
答案 0 :(得分:4)
条件变量可以虚假地唤醒,并且通常不存储唤醒事件(即,在任何人等待它之前发出的唤醒就像在没有人听到的情况下在木头中的手掌一样丢失)。因此,条件变量几乎总是在循环中使用:
bool is_answered = false;
// method1
boost::lock_guard<boost::mutex> lock( wait_answer_mutex );
while ( ! is_answered )
wait_answer_condition.wait(lock);
// method2
boost::lock_guard<boost::mutex> lock( wait_answer_mutex );
is_answered = true;
wait_answer_condition.notify_one();