class FCriticalSection { CRITICAL_SECTION CriticalSection; public: FORCEINLINE FCriticalSection(void) { InitializeCriticalSection(&CriticalSection); } FORCEINLINE ~FCriticalSection(void) { DeleteCriticalSection(&CriticalSection); } FORCEINLINE void Lock(void) { if( TryEnterCriticalSection(&CriticalSection) == 0 ) { EnterCriticalSection(&CriticalSection); } } FORCEINLINE void Unlock(void) { LeaveCriticalSection(&CriticalSection); } };
上面的FCriticalSection封装了windows下面的一个临界区,包括了初始化,销毁,解锁,锁定操作。
在多线程的时候我们会经常出现Lock了但是有没有unlock的情况,以及出现没有成对使用的情况,所有我们实现一个Lock函数来进行lock和unlock,并且保证了lock先于unlock。
class FScopeLock { FCriticalSection* SynchObject; FScopeLock(void); FScopeLock(FScopeLock* InScopeLock); FScopeLock& operator=(FScopeLock& InScopeLock) { return *this; } public: FScopeLock(FCriticalSection* InSynchObject) : SynchObject(InSynchObject) { check(SynchObject); SynchObject->Lock(); } ~FScopeLock(void) { check(SynchObject); SynchObject->Unlock(); } };
FScopeLock 构造函数和析构函数会分别调用临界对象的lock和unlock
这样可以再栈里初始化一个FScopeLock对象。在栈销毁的时候unlock会被自动调并被自动释放。这样保证了整个过程的安全
例子代码如下
{ FScopeLock ScopeLock( &SynchronizationObject ); }