개발관련/C&C++

임계영역(Critical Section)

Diademata 2018. 1. 5. 02:59
반응형

C++은 finally 구문이 없으므로 스마트 포인터나 변수를 스택에 올려 포인터나 변수가 소멸될때 함수 호출로 finally 처리한다.


사용법

bool IOCPThreadPool::InsertQueueItem(std::function<void(void*)> callback, void* args)

{

if (_completionPort == NULL) return false;


auto finally = Util::Common::Finally(std::bind(&CriticalSection::LeaveCriticalSection, &_cs));

try

{

_cs.EnterCriticalSection();

WaitCallback* p_waitCallback = new WaitCallback(callback, args);

if (p_waitCallback == NULL) return false;

return PostQueuedCompletionStatus(_completionPort, 0, (ULONG_PTR)p_waitCallback, NULL);

}

catch (...)

{

return false;

}

}



#pragma once

#include<functional>

#include "NS.h"


NS_COMMON_BEGIN

class Finally

{

private:

std::function<void(void)> _func;

public:

Finally(std::function<void(void)> func = nullptr);

virtual ~Finally();

};

inline Finally::Finally(std::function<void(void)> func)

{

this->_func = func;

}

inline Finally::~Finally()

{

if (_func != nullptr) _func();

}

NS_COMMON_END



CriticalSection.h

전역 함수를 클래스로 wrapping


#pragma once

#include "NS.h"

#include <Windows.h>

NS_THREADING_BEGIN

class CriticalSection

{

public:

CriticalSection();

virtual ~CriticalSection()

{

DeleteCriticalSection(&_cs);

}

public:

bool TryEnterCriticalSection();

void EnterCriticalSection();

void LeaveCriticalSection();

private:

CRITICAL_SECTION _cs;

};

inline CriticalSection::CriticalSection()

{

InitializeCriticalSection(&_cs);

}

inline CriticalSection::~CriticalSection()

{

DeleteCriticalSection(&_cs);

}

inline bool CriticalSection::TryEnterCriticalSection()

{

return ::TryEnterCriticalSection(&_cs);

}

inline void CriticalSection::EnterCriticalSection()

{

::EnterCriticalSection(&_cs);

}

inline void CriticalSection::LeaveCriticalSection()

{

::LeaveCriticalSection(&_cs);

}

NS_THREADING_END

반응형