为防止死锁,其中一种简单的办法是顺序的加锁。而使用层次锁可以减轻程序员的负担,检查运行时是否遵循了约定。其思路是将应用程序分层,当代码试图锁定一个互斥元的时候检查当前线程是不是已经有一个比较低级的互斥元在锁的状态了。因此锁的顺序只能先锁层级高的锁再锁层级低的锁。
//hierarchical_mutex.h文件
#pragma once
#include <mutex>
class hierarchical_mutex {
public:
static thread_local unsigned long this_thread_hierarchy_value;
explicit hierarchical_mutex(unsigned long value) :_hierarchy_value(value), _previous_hierarchy_value(0){};
void lock();
void unlock();
bool try_lock();
private:
unsigned long const _hierarchy_value;
unsigned long _previous_hierarchy_value;
void check_hierarchy();
void update_hierarchy();
std::mutex _internal_lock;
};
//hierarchical_mutex.cpp文件
#include "pch.h"
#include "hierarchical_mutex.h"
#include <iostream>
thread_local unsigned long hierarchical_mutex::this_thread_hierarchy_value = ULONG_MAX;
void hierarchical_mutex::