I have a class with member functions that require a boost::unique_lock be acquired on the respective mutex before performing their operation. However, when the member function is called when there is an existing boost::unique_lock it deadlocks itself.
#include <iostream>
#include "boost/thread.hpp"
#include "boost/foreach.hpp"
#include <list>
class example {
private:
std::list< int > int_array;
std::list< int >::iterator array_iterator;
mutable boost::shared_mutex array_mutex;
public:
/*
* Move the iterator forward.
*/
inline example & next( ) {
boost::unique_lock< boost::shared_mutex > lock( array_mutex );
array_iterator++;
if( array_iterator == int_array.end( ) ) {
array_iterator = int_array.begin( );
}
return *this;
}
/*
* Get int_array_mutex.
*/
inline boost::shared_mutex & mutex( ) const {
return array_mutex;
}
/*
* Get int_array.
*/
inline std::list< int > & array() {
return int_array;
}
};
int main() {
example example_instance;
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++;
}
//Causes deadlock
example_instance.next();
std::cout << "This shall not be emitted." << std::endl;
return 0;
}
How can I fix this?