#include #include #include pthread_mutex_t p_mutex; // #include // boost::mutex b_mutex; #define TRACE std::cout << __FILE__ << " @ " << __PRETTY_FUNCTION__ << ":" << __LINE__ << std::endl; class ScopedLock { public: ScopedLock(pthread_mutex_t & mutex) : m_mutex(mutex) { TRACE; pthread_mutex_lock( &m_mutex ); } ~ScopedLock(void ) { TRACE; pthread_mutex_unlock( &m_mutex ); } private: pthread_mutex_t& m_mutex; }; void fv () { ScopedLock sl(p_mutex); throw std::logic_error("p_thread stuff"); } // void fv2 () // { // boost::mutex::scoped_lock lock(&b_mutex); // // throw std::logic_error("boost_thread stuff"); // } int main() { pthread_mutex_init( &p_mutex, NULL ); try { fv(); } catch (...) { TRACE; if (pthread_mutex_trylock( &p_mutex) == 0 ) { // std::cout << "pthread mutex is OK, unlocked " << std::endl; // pthread_mutex_unlock( &p_mutex ); } else { // std::cout << "pthread mutex is STILL LOCKED!" << std::endl; } } pthread_mutex_destroy( &p_mutex ); // try { // fv2(); // } catch (...) { // TRACE; // if ( b_mutex.try_lock() == true ) { // std::cout << "boost mutex is OK, unlocked " << std::endl; // b_mutex.unlock(); // } else { // std::cout << "boost mutex is STILL LOCKED!" << std::endl; // } // } return 0; }