hierarchical mutex

来源:互联网 发布:淘宝店铺起名大全家居 编辑:程序博客网 时间:2024/05/16 01:06
/****************************************************************************@File Name: hierarchical_mutex.h@Author: @mail: @Created Time: Sun 19 Mar 2017 09:17:24 AM CST****************************************************************************/#ifndef HIERARCHICAL_MUTEX_H#define HIERARCHICAL_MUTEX_H#include <thread>#include <mutex>#include <stdexcept>#include <climits>namespace hierarchical_mutex{using namespace std;class HierarchicalMutex{private:mutex m_lock;unsigned long const m_current_value;// current hierarchical valueunsigned long m_previous_value;// previous hierarchical valuestatic thread_local unsigned long m_thisthread_value;private:inline void check_hierarchy_violation(){if(m_thisthread_value <= m_current_value){throw logic_error("mutex hierarchy violation...!\n");}}inline void update_hierarchy_value(){m_previous_value = m_thisthread_value;m_thisthread_value = m_current_value;}public:explicit HierarchicalMutex(unsigned long value):m_current_value(value), m_previous_value(0){}void lock();void unlock();bool try_lock();};}#endif/****************************************************************************@File Name: hierarchical_mutex.h@Author: @mail: @Created Time: Sun 19 Mar 2017 09:17:24 AM CST****************************************************************************/#include "hierarchical_mutex.h"namespace hierarchical_mutex{thread_local unsigned long HierarchicalMutex::m_thisthread_value(ULONG_MAX);void HierarchicalMutex::lock(){check_hierarchy_violation();m_lock.lock();update_hierarchy_value();}void HierarchicalMutex::unlock(){m_thisthread_value = m_previous_value;m_lock.unlock();}bool HierarchicalMutex::try_lock(){check_hierarchy_violation();if(!m_lock.try_lock()) return false;update_hierarchy_value();return true;}}/****************************************************************************@File Name: main.cpp@Author: @mail: @Created Time: Sun 19 Mar 2017 09:50:25 AM CST****************************************************************************/#include "hierarchical_mutex.h"#include <iostream>using namespace hierarchical_mutex;HierarchicalMutex hm0(10);HierarchicalMutex hm1(8);void do_low_level(){cout << "do_low_level()...!" << endl;}void do_high_level(){cout << "do_high_level()...!" << endl;}void low_level_func(){lock_guard<HierarchicalMutex>lk(hm1);do_low_level();}void high_level_func(){lock_guard<HierarchicalMutex>lk(hm1);try{low_level_func();}catch(exception &e){cerr << e.what();}}int main(){thread th0(high_level_func);th0.join();return 0;}CC=g++all:$(CC) -std=c++11 -g -o hierarchical_mutexTest main.cpp hierarchical_mutex.cpp hierarchical_mutex.h -pthread

0 0
原创粉丝点击