Есть паттерн смартлока который умел бы отличать внутренний вызов от внешнего?
Пример:
class A
{
protected:
mutex mutex_obj;
public:
A();
bool set_a(long a_value)
{
lock_guard<mutex> lock(mutex_obj); //должен срабатывать при внешнем вызове, например: A* a = new A(); a->set_a(1000);
//....
};
bool exec()
{
lock_guard<mutex> lock(mutex_obj);
//....
set_a(100); //deadlock
//....
};
virtual ~A();
};
class B : public A
{
public:
B();
bool set_b(long b_value)
{
lock_guard<mutex> lock(mutex_obj);
//....
set_a(100); //deadlock
//....
};
~B();
};
Конечно можно было бы сделать так:
bool set_a(long a_value)
{
lock_guard<mutex> lock(mutex_obj);
return set_a_internal(a_value);
};
bool set_a_internal(long a_value)
{
//...code
};
Но это много писанины, хотелось бы универсальности: то есть нужен какой то smartlock_guard который пропускал бы внутренние вызовы без блокировки.