проблема повышения условия? - PullRequest
1 голос
/ 27 января 2012

У меня проблема с бустом, у меня есть две переменные экземпляра в классе cpp:

boost::condition          wait_answer_condition;
boost::mutex              wait_answer_mutex;

тогда у меня есть метод, который отправляет сообщение и при условии:

method1

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];

тогда у меня есть другой метод, который получает результат и пробуждает поток отправителя

method2

int requestID = responseData->getInt32Value("response_id");
responseIdSyncMap.insert(make_pair(requestID, responseData));
wait_answer_condition.notify_one();

оба метода вызываются в разных потоках. Проблема состоит в том, что когда вызывается метод2, wait_answer_condition освобождается перед вызовом wait_answer_condition.notify_one (), а метод1 просыпается, не найдя результата.

У кого-нибудь есть идеи по этому поводу?

1 Ответ

4 голосов
/ 27 января 2012

Переменные условия могут внезапно пробуждаться, и события пробуждения, как правило, не сохраняются (то есть пробуждение, которое выдается перед тем, как кто-либо ждет его, теряется, как рукопожатие в лесу, когда никто не слышит). Поэтому условные переменные почти всегда используются в цикле:

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