????1.?????????????????InitializeCriticalSection()
??????????InitializeCriticalSection(&m_criticalSection);??ε????????????????????????????????????????m_criticalSection??????????????????InitializeCriticalSection()????????InitializeCriticalSection()????InitializeCriticalSection()??
???????????£?
1 class CAVIFile
2 {
3 public:
4     CAVIFile()
5     {
6         if (m_shouldInit)
7         {
8             InitializeCriticalSection(&m_criticalSection); // ??????????
9             m_shouldInit = false;
10         }
11     }
12     HRESULT OpenFile(const string& strFileName?? const string& strDirectoryPath)
13     {
14         // ....
15         EnterCriticalSection(&m_criticalSection);
16         SetCurrentDirectory(strDirectoryPath.c_str());
17         // ...
18         LeaveCriticalSection(&m_criticalSection);
19         //...
20     }
21     // ...
22 private:
23     // ...
24     // ?????????????????????
25     static CRITICAL_SECTION m_criticalSection;
26     static bool m_shouldInit;
27 };
28 CRITICAL_SECTION CAVIFile::m_criticalSection;
29 bool  CAVIFile::m_shouldInit = true;
????????????????????????????????ж?????????????m_shouldInit???ж???????InitializeCriticalSection()?????????????InitializeCriticalSection()??????InitializeCriticalSection()???????????????????????????????????????????????????????????m_shouldInit?????m_shouldInit?????????????????????m_shouldInit?????????????????????????????????ζ??????????????InitializeCriticalSection(&m_criticalSection)??ε?????????????????????????????????????????????????m_shouldInit????????????????InitializeCriticalSection()????????????????????????????????????????????
???????????????????????????
????2??????????
????????????У???????????????????????????????????????????????????????????????????????ι??????????????????????????????InitializeCriticalSection()??????????
?????????????£?
1 class CAVIFile
2 {
3 public:
4     // ...
5     HRESULT OpenFile(const string& strFileName?? const string& strDirectoryPath)
6     {
7         // ....
8         EnterCriticalSection(&m_criticalSection);
9         SetCurrentDirectory(strDirectoryPath.c_str());
10         // ...
11         LeaveCriticalSection(&m_criticalSection);
12         //...
13     }
14     // ...
15 private:
16     //...
17     // ?????????????????????
18     static CRITICAL_SECTION m_criticalSection;
19 private:
20     // Singleton?????????????????????????????m_criticalSection
21     // ?????
22     class Singleton
23     {
24     private:
25         Singleton() { InitializeCriticalSection(&m_criticalSection); }
26         Singleton(const Singleton& other);
27         Singleton& operator=(const Singleton& other);
28
29         static Singleton m_Singleton;
30     };
31     friend class Singleton;
32 };
33 CRITICAL_SECTION CAVIFile::m_criticalSection;
34 CAVIFile::Singleton CAVIFile::Singleton::m_Singleton;
??????????????????????????????????????????????????????????????Σ????????m_criticalSection ??InitializeCriticalSection()??Ρ???????????????????