Je suis en train de créer un verrou Mutex conditionnel à portée variable.
J'ai cette classe définie dans mon en-tête :
class ConditionalLock
{
public:
ConditionalLock(eastl::function<bool()> condition);
~ConditionalLock();
private:
static std::mutex s_mtx;
static bool s_shouldLock;
static bool s_lockInit;
};
.cpp ressemble à ceci :
ConditionalLock::ConditionalLock(std::function<bool()> condition)
{
if (!s_lockInit)
{
if (condition())
s_shouldLock = true;
s_lockInit = true;
}
if (s_shouldLock)
s_mtx.Lock();
}
ConditionalLock::~ConditionalLock()
{
if (s_shouldLock)
s_mtx.Unlock();
}
Ce verrou conditionnel fait l'affaire si je l'utilise à un seul endroit, compte tenu du fait qu'il contient trois membres statiques qui suivent tout ce dont j'ai besoin. Cependant, je veux avoir un mutex conditionné générique qui pourrait être réutilisé partout. Quelle serait la bonne approche ?
J'ai pensé à créer une classe ConditionalMutexContext qui serait instanciée dans la portée de l'objet où je veux utiliser ce mutex, et cette configuration contiendrait ces propriétés.
Quelque chose comme ça :
class ConditionalLockContext
{
public:
ConditionalLockContext(
std::function<bool()> condition)
: m_condition(condition)
private:
std::function<bool()> m_condition;
bool m_shouldLock;
bool m_lockInit;
}
Et ensuite, passer l'instance de ConditionalLockContext au verrou conditionnel par référence.
Pouvez-vous imaginer une meilleure approche pour ce scénario spécifique ?