#pragma once
#include<mutex>
class hierarchy_mutex
{
public:
hierarchy_mutex(unsigned long val) :hierarval(val) {};
void check()
{
if (hierarval >= this_thread_level_val)
{
throw std::logic_error("mutex val error");
}
}
void update()
{
prehierarval = this_thread_level_val;
this_thread_level_val = hierarval;
}
void lock()
{
check();
m.lock();
update();
}
void unlock()
{
if (this_thread_level_val == hierarval)
{
this_thread_level_val = prehierarval;
m.unlock();
}
else
throw std::logic_error("mutex val error");
}
bool try_lock()
{
check();
if (m.try_lock())
{
update();
return true;
}
return false;
}
private:
const unsigned long hierarval;
unsigned long prehierarval=0;
static thread_local unsigned long this_thread_level_val;
std::mutex m;
};
#include"hierarchy_mutex.h"
thread_local unsigned long hierarchy_mutex::this_thread_level_val(ULONG_MAX);