看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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... 先感謝各位的指教! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.220.247.138 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1425483911.A.821.html
longlongint: 就要做同步呀 03/10 18:25