hierarchical mutex

本文介绍了一种基于层级概念的互斥锁实现方法,通过维护每个线程的层级值来确保正确的锁定顺序,防止死锁发生。代码示例展示了如何使用此类互斥锁并提供了简单的应用程序验证其功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/****************************************************************************
@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 value
	unsigned long m_previous_value;				// previous hierarchical value
	static 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值