在我的多线程服务器中,我有somefunction()
,它需要使用EnterCriticalSection
来保护两个彼此独立的其他全局数据。使功能异常安全
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个储物柜放在一个功能中):
somefunction()
{
// g_List,g_Variable previously initialized via InitializeCriticalSection
Locker lock(g_List);
Locker lock(g_Variable);
...
...
}
?
如果我始终保持相同的锁定顺序,那该怎么办? – maciekm
是的,但实践表明,跨越任何不平凡的应用程序确实很难做到。 – tumdum