Здравствуйте!
Где-то в каком-то потоке периодически что-то производится, какие-то действия. Иногда надо временно запретить их производить.
В других потоках, или в том же потоке, можно запрещать, рекурсивно, главное, разлочить столько же раз, сколько и залочил.
Что-то городить с какими-то примитивами синхронизации не вижу смысла, ну, может я ошибаюсь.
Пока придумалась такая схема (псевдокод):
class Locable
{
std::atomic<bool> m_lock;
public:
void lock();
void unlock();
bool isLocked() const;
};
// Где-то в цикле что-то периодически делается
if (!locablePermitter.isLocked())
{
doSomething();
}
// Тут ведём подсчет количества блокировок
class Locker
{
std::atomic<int> m_counter;
Locable *m_pLocable;
public:
void lock()
{
if (++m_counter > 0)
{
m_pLocable->lock();
}
}
void lock()
{
if (--m_counter <= 0)
{
m_pLocable->unlock();
}
}
};
Ну или как лучше сделать? Может, есть что-то стандартное, чем изобретать велосипеды?