Иногда требуется внутри функции выставить флаг, а на выходе из функции сбросить его.
Например, следующим образом:
void SomeClass::SomeFunction(void)
{
m_flag = true;
... // тело функции
m_flag = false;
}
Однако дело осложняется тем, что у функции может быть несколько точек выхода, в том числе неявных. Лучше доверить сброс флага проверенным средствам. Например, так:
Я к тому, что использование автоматических переменных это как раз то, что можно было ожидать от подсказки. Но:
1. Об этих самых переменных тут ни слова.
2. Причем тут boost::shared_ptr?
class AutoScopedLock
{
protected:
CRITICAL_SECTION* m_cs;
public:
AutoScopedLock(CRITICAL_SECTION* cs)
: m_cs(cs)
{}
~AutoScopedLock()
{
LeaveCriticalSection(m_cs);
}
operatorbool()const
{
EnterCriticalSection(m_cs);
returntrue;
}
};
#define ScopedLock(_cs_)if( AutoScopedLock _scoped_lock = _cs_ )// использование
ScopedLock(criticalSection)
{
// тут делать операции под защитой крит секции
}
и раз уж тут if, то легко добавить Try.
class AutoScopedLock
{
protected:
CRITICAL_SECTION* m_cs;
bool m_acquired;
public:
AutoScopedLock(CRITICAL_SECTION* cs)
: m_cs(cs), m_acquired(false)
{}
~AutoScopedLock()
{
if( m_acquired )
LeaveCriticalSection(m_cs);
}
operatorbool()const
{
return(m_acquired = (TryEnterCriticalSection(m_cs) != 0));
}
};
#define TryScopedLock(_cs_)if( AutoScopedLock _scoped_lock = _cs_ )// использование
TryScopedLock(criticalSection)
{
// смогли войти в крит секцию, делаем свои дела тут
}
хотя вариант с Try возможно стоит делать не TryScopedLock(criticalSection), а как нибудь типа if( TryLock(criticalSection) ) для наглядности.
где TryLock:
#define TryLock(_cs_) AutoScopedLock _scoped_lock = _cs_
Pushkoff
да нет, нигде такого не видел и в попкапе такого нет. Там есть AutoCrit, но разница в том, что его надо объявлять как переменную, внутри блока, а моя конструкция - больше похожа на блоки if\for\while или using(C#), логически более понятна и наглядна. Это не замена таким классам, как AutoCrit, а дополнение, ведь часто нужно ограничить не всю область внутри функции, а только маленький блок, в таких случаях она и пригодится.