[問題] 關於Crtitical Section的觀念

作者: Keitaro (動き出す時間...)   2015-03-04 23:45:08
開發平台(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...
先感謝各位的指教!
作者: longlongint (華哥爾)   2015-03-10 18:25:00
就要做同步呀

Links booklink

Contact Us: admin [ a t ] ucptt.com