На моем многопоточном сервере у меня есть somefunction()
, который должен защитить две независимые друг от друга глобальные данные, используя EnterCriticalSection
.make function exception-safe
somefunction()
{
EnterCriticalSection(&g_List);
...
EnterCriticalSection(&g_Variable);
...
LeaveCriticalSection(&g_Variable);
...
LeaveCriticalSection(&g_List);
}
Следуя советам лучших программистов, я собираюсь использовать обертку RAII. Например:
class Locker
{
public:
Locker(CSType& cs): m_cs(cs)
{
EnterCriticalSection(&m_cs);
}
~Locker()
{
LeaveCriticalSection(&m_cs);
}
private:
CSType& m_cs;
}
Мой вопрос: Это нормально, чтобы превратить somefunction()
к этому? (ввод 2 Locker в одной функции):
somefunction()
{
// g_List,g_Variable previously initialized via InitializeCriticalSection
Locker lock(g_List);
Locker lock(g_Variable);
...
...
}
?
Что делать, если я всегда соблюдаю тот же порядок блокировки, это имеет значение? – maciekm
Да, но практика показывает, что это действительно сложно сделать с любым нетривиальным приложением. – tumdum