开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC2008
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
MFC
问题(Question):
请教关于MFC CCrtitcal Section的观念,
以及WaitForMultipleObject的功能
补充说明(Supplement):
不好意思不才小弟我又上来请教一下各位先进。
有关于MultiThread的实作上,我对于Critical Section概念一直有点模糊。
我想请教一下关于CCriticalSection这个class的实作。
我参考同事的写法有两种情况要用到CCriticalSection。
Case1
某一个function call有两个以上的thread会呼叫,
则这个function一进入就上锁,离开解锁。
// header
ClassA
{
CCriticalSection m_CS_Lock;
void fun();
}
// CPP
void ClassA::fun()
{
m_CS_Lock.Lock();
// 实作
m_CS_Lock.Unlock();
}
Case2
物件中某一个变量,会被两个不同的thread在不同的地方修改数值。
ClassA
{
int m_var;
CCriticalSection m_CS_Lock;
void fun1();
void fun2();
}
// CPP
void ClassA::fun1()
{
m_CS_Lock.Lock();
// 修改数值
m_var = 1;
m_CS_Lock.Unlock();
}
void ClassA::fun2()
{
m_CS_Lock.Lock();
// 修改数值
m_var = 2;
m_CS_Lock.Unlock();
}
Case1我能理解,第一个thread上锁后,在离开解锁之前,第二的thread进不来。
但是Case2我不太明白。
我的想法是,是否这个m_CS_Lock一旦有某一个thread上锁了,
其他所有有这个锁的地方也全部上锁?
假设第一个thread跑到fun1上锁,则第二个thread进入fun2时,
发现已经被上锁,必须要等待第一个thread解锁完?
如果我的想法是正确的话,感觉CCriticalSection跟flag有点像啊,
只是flag没办法让thread停在原处不动。
另外,因为写到MultiThread的关系,
我想请教一下MFC是否有类似于WaitForMultipleObject的实作功能呢?
Win32API的WaitForMultipleObject必须要输入handle vector,
但既然我写的是MFC,我习惯用AfxBeginThread,得到的是CWinThread pointer。
当然我是可以建一个vector然后把所有的CWinThread的handle取出来放进去,
但感觉这样觉得很...low...
先感谢各位的指教!