Я не использовал усиление потоков, но если я правильно прочитал ваш код, вы заблокировали мьютекс в своей основной функции, а затем вызвали метод examlpe_instance
next()
, который также пытается получить блокировку мьютекса массива. ... естественно, это может привести к тупику, поскольку не похоже, что блокировка повторная.
Почему вы получаете блокировку в основной функции?
Обновление:
Вы не можете повторно получить блокировку дважды в пределах одной и той же области, если только у вас нет повторной блокировки (которой у вас нет), поэтому попробуйте изменить область:
int main() {
example example_instance;
{// new scope
boost::unique_lock< boost::shared_mutex> lock(example_instance.mutex());
//Manipulate int_array...
example_instance.array().push_back(1);
example_instance.array().push_back(2);
example_instance.array().push_back(3);
example_instance.array().push_back(4);
BOOST_FOREACH(int & x, example_instance.array()) {
x++;
}
}// end scope
// should not cause deadlock now
example_instance.next();
std::cout << "This shall not be emitted." << std::endl;
return 0;
}
Если boost работает так, как я себе представляю, то boost должен снять блокировку, как только она выйдет из области видимости. Попробуйте приведенную выше модификацию и посмотрите, есть ли у вас тупик (если он все-таки есть, вам нужно как-то явно снять блокировку, но я не знаю, как это делается в boost).