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
'개발관련 > C&C++' 카테고리의 다른 글
Convert Json To Xml (0) | 2018.01.17 |
---|---|
Xmllite SAX(Simple Api for Xml) TreeNode 구현 및 LIB (XMLParser) (0) | 2018.01.11 |
IOCP ThreadPool 구현 Lib 및 사용 방법 (0) | 2018.01.11 |
DataTable (0) | 2017.12.15 |
아두이노>초음파 센서를 이용한 물 높이 측정 (0) | 2017.07.27 |