【问题标题】:boost condition issue?升压条件问题?
【发布时间】:2012-02-20 10:58:38
【问题描述】:

我的 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()”之前被释放,method1被唤醒而没有找到结果。

有人知道吗?

【问题讨论】:

  • 根据boost.org/doc/libs/1_48_0/doc/html/thread/…,我认为这种行为是有意的——你忘了锁定线程
  • 也有了锁,我得到了同样的结果。原因是等待条件的虚假行为。请参阅 thiton 答案。

标签: c++ multithreading boost conditional-statements


【解决方案1】:

条件变量可能会被虚假唤醒,并且唤醒事件通常不会被存储(即,在任何人等待它之前发出的唤醒就会丢失,就像在无人听到时在树林里拍手一样)。因此,条件变量几乎总是在循环中使用:

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();

【讨论】:

猜你喜欢
  • 2010-11-05
  • 2011-10-02
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多